login  Naam:   Wachtwoord: 
Registreer je!
 Scripts:

Scripts > PHP > GD library > RWCaptcha (anti-bot / code overtypen)

RWCaptcha (anti-bot / code overtypen)

Auteur: Tuinstoel - 05 november 2010 - 09:54 - Gekeurd door: Koen - Hits: 1427 - Aantal punten: (0 stemmen)


Dit scriptje maakt het welbekende plaatje dat er voor zorgt dat op websites formulieren niet worden ingevuld door bots. Met andere woorden je moet hier dus een code overtypen.

Ik heb de code voorzien van commentaar dus dan kun je precies zien wat er gewijzigd kan worden en wat niet. Het is verder ook plug and play, dus het moet in principe gewoon direct werken.

Let op dat je de .rar gewoon downloadt, want daar zitten de fonts (arial.ttf en georgia.ttf) bij in. Als je dat niet doet moet je er zelf voor zorgen.

Code:

RWCaptcha.php
  1. <?php
  2. /**
  3.  * Genereert een CAPTCHA Code die gekke botjesspam moet voorkomen in
  4.  * bijvoorbeeld gastenboeken.
  5.  *
  6.  * @author René Willemsen (rene@renewillemsen.nl)
  7.  * @version 1.0 (2010-11-05)
  8.  */
  9.  
  10.  
  11. class RWCaptcha {
  12.  
  13. /* Algemene instellingen */
  14. private $iHeight = 51; // Hoogte van het plaatje
  15. private $iWidth = 201; // Breedte van het plaatje
  16. private $aBackground = array('red'=>255,'green'=>255,'blue'=>255); // Kleur van de achtergrond in te stellen van 0 tot 255
  17. private $sTokens = 'abcdefghjikmnlopqrstuvwxyz'; // Reeks tekens die kunnen voorkomen. Wees verstandig en doe geen gekke dingen zoals ö of een 0 (nul), dit verwart.
  18. private $iLength = 6; // Lengte van de te genereren string
  19.  
  20. /* Afblijven */
  21. private $rImage;
  22. private $sCode;
  23.  
  24. /* Text instellingen */
  25. private $aFont = array('arial.ttf','georgia.ttf'); //,'calibri.ttf','georgia.ttf'); // Locatie van de font
  26. private $aTextColorRange = array('min'=>0,'max'=>150); // Mogelijke kleuren van de letters (verschilt per letter) Zorg voor voldoende contrast.
  27. private $iFontSize = 24; // Grootte van de fontsize. Er zit volgensmij een beperking op tot ongeveer 18pt
  28. private $iAngleMin = -30; // Minimale hoek (mag negatief zijn) waarop een letter staat
  29. private $iAngleMax = 30; // Maximale hoek
  30.  
  31. /* Achtergrondraster */
  32. private $bRaster = true; // False voor als er geen raster weergegeven moet worden
  33. private $aRasterColor = array('red'=>200,'green'=>200,'blue'=>200); // Kleur van dit raster.
  34. private $iSpacingRow = 10; // Ruimte per rij (over de Y-as)
  35. private $iSpacingCol = 10; // Ruimte per kolom (over de X-as)
  36.  
  37. /* Achtergrondcirkels */
  38. private $bCirkel = true;
  39. private $aCirkelColor = array('min'=>150,'max'=>255);
  40. private $iCirkelAantal = 30;
  41.  
  42.  
  43. /* Hier beneden hoef je in principe niets meer aan te passen */
  44.  
  45. public function __construct() {
  46. if(extension_loaded('gd') && function_exists('gd_info')) {
  47. // GD Library aanwezig als het goed is...
  48.  
  49.  
  50. if($this->iFontSize >= $this->iHeight|| ($this->iLength*$this->iFontSize*0.5) > $this->iWidth) {
  51. // De fontsize is te groot ten opzichte van de ruimte die ie nodigt heeft. Dus stoppen
  52. // Resulteert in een kruisje ;-)
  53. }
  54. else {
  55. putenv('GDFONTPATH=' . realpath('.'));
  56. // putenv is nodig voor lastige servers... ;-)
  57. $this->generateCode();
  58. $this->startImage();
  59. $this->generateBackground();
  60. $this->writeText();
  61. $this->finalizeImage();
  62. }
  63. }
  64. else {
  65. }
  66. }
  67.  
  68. /* Aanmaken van de afbeelding, de .php wijsmaken dat ie 'n PNG is */
  69. private function startImage() {
  70. header("Content-Type: image/png");
  71. $this->rImage = ImageCreate($this->iWidth,$this->iHeight);
  72. }
  73.  
  74. /* Afsluiten van het GD-proces */
  75. private function finalizeImage() {
  76. ImagePng($this->rImage);
  77. imagedestroy($this->rImage);
  78. }
  79.  
  80. /* Achtergrond een kleur geven en evt. invulling */
  81. private function generateBackground() {
  82. //blaat
  83. $rBackground = imagecolorallocate($this->rImage, $this->aBackground['red'],$this->aBackground['green'],$this->aBackground['blue']);
  84. ImageFill($this->rImage,0,0,$rBackground);
  85.  
  86. if($this->bRaster) {
  87. $this->generateRaster();
  88. }
  89.  
  90. if($this->bCirkel) {
  91. $this->generateCirkel();
  92. }
  93. }
  94.  
  95. /* Voor het maken van een raster */
  96. private function generateRaster() {
  97. $rColor = imagecolorallocate($this->rImage, $this->aRasterColor['red'],$this->aRasterColor['green'],$this->aRasterColor['blue']);
  98.  
  99. // horizontal
  100. for($iHor = 0;$iHor<$this->iHeight;$iHor+=$this->iSpacingCol) {
  101. imageline($this->rImage, 0,$iHor, $this->iWidth, $iHor, $rColor);
  102. }
  103.  
  104. for($iVer = 0;$iVer<$this->iWidth;$iVer+=$this->iSpacingRow) {
  105. imageline($this->rImage, $iVer, 0, $iVer, $this->iHeight, $rColor);
  106. }
  107. // vertical
  108. }
  109.  
  110. private function generateCirkel() {
  111. for($iCirk = 0;$iCirk<$this->iCirkelAantal;$iCirk++) {
  112. $iSize = rand(10,100);
  113. $rColor = imagecolorallocate($this->rImage, rand($this->aCirkelColor['min'],$this->aCirkelColor['max']), rand($this->aCirkelColor['min'],$this->aCirkelColor['max']), rand($this->aCirkelColor['min'],$this->aCirkelColor['max']));
  114. imagearc($this->rImage, rand(0,$this->iWidth), rand(0,$this->iHeight), $iSize, $iSize,0, 360, $rColor);
  115. }
  116. }
  117.  
  118. /* Het daadwerkelijk printen van de text */
  119. private function writeText() {
  120. $iMaximumStartFromLeft = $this->iWidth*0.2;
  121. // Uitvogelen wat de maximale positie mag zijn ten opzichte van (0,Y)
  122. $iLocationFromLeft = rand(10,$iMaximumStartFromLeft);
  123. // X-positie eerste letter
  124. $iLocationFromTop = rand($this->iHeight-($this->iHeight*0.2),$this->iHeight-($this->iHeight*0.5));
  125. // Y-positie eerste letter
  126. $iAngle = rand($this->iAngleMin,$this->iAngleMax);
  127. // Hoek v/d 1e letter
  128. for($iLoop=0;$iLoop<strlen($this->sCode);$iLoop++) {
  129. $rColor = imagecolorallocate($this->rImage, rand($this->aTextColorRange['min'],$this->aTextColorRange['max']),rand($this->aTextColorRange['min'],$this->aTextColorRange['max']),rand($this->aTextColorRange['min'],$this->aTextColorRange['max']));
  130. imagefttext($this->rImage, 28, $iAngle, $iLocationFromLeft, $iLocationFromTop, $rColor, $this->aFont[rand(0,(count($this->aFont)-1))], substr($this->sCode,$iLoop,1));
  131.  
  132.  
  133. /* Letterinstellingen opnieuw instellen */
  134. $iLocationFromLeft = $iLocationFromLeft + $this->iFontSize;
  135. $iLocationFromTop = rand($this->iHeight-($this->iHeight*0.2),$this->iHeight-($this->iHeight*0.5));
  136. $iAngle = rand($this->iAngleMin,$this->iAngleMax);
  137. }
  138.  
  139. }
  140.  
  141. /* De code genereren */
  142. private function generateCode() {
  143. $sString = '';
  144.  
  145. for($iLoop=0;$iLoop<$this->iLength;$iLoop++) {
  146. $iStart = rand(0,strlen($this->sTokens));
  147. $sString .= substr($this->sTokens,$iStart,1);
  148. }
  149. $this->sCode = $sString;
  150. $this->setCodeInSession();
  151. }
  152.  
  153. /* Beetje overbodige functie eigenlijk */
  154. private function setCodeInSession() {
  155. $_SESSION['sCode'] = $this->sCode;
  156. }
  157.  
  158. }
  159.  
  160. /* Heel belangrijk:
  161.  * -Nieuwe sessie starten (!!!)
  162.  * -Nieuwe instantie van de Captcha aanmaken
  163.  */
  164. $r = new RWCaptcha();
  165. ?>




Voorbeeld gebruik:
  1. <?php
  2. /**
  3.  * Voorbeelddocument
  4.  *
  5.  * @author René Willemsen (rene@renewillemsen.nl)
  6.  * @version 1.0 (2010-11-05)
  7.  */
  8. ?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  9. <html>
  10. <head>
  11. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  12. <title>Voorbeeld RWCaptcha</title>
  13. </head>
  14. <body>
  15. <?php
  16. if($_SERVER['REQUEST_METHOD'] == 'POST') {
  17. if(isset($_SESSION['sCode'])) {
  18. if($_POST['code']==$_SESSION['sCode']) {
  19. echo '<p>De code is juist!</p>';
  20. }
  21. else {
  22. echo '<p>Ben je blind ofzo?</p>';
  23. }
  24. }
  25. else {
  26. echo '<p>Sessie niet gezet. Check je script op session_start() aanwezigheid.</p>';
  27. }
  28. }
  29. ?>
  30.  
  31. <form method="post" action="index.php">
  32. <p><img src="RWCaptcha.php" alt="" /></p>
  33. <p>Type de code over: <input type="text" name="code" /></p>
  34. <p><input type="submit" value="Verzenden" /></p>
  35. </form>
  36.  
  37.  
  38. </body>
  39. </html>

Download code! Download code (.txt)

Download dit script!  Bekijk een voorbeeld van dit script!
 Stemmen
Niet ingelogd

 Reacties
Post een reactie
Lees de reacties  ( 1 )
© 2002-2012 Sitemasters.be - Regels - Gehost door: Vircon - Laadtijd: 0.129s