U bevindt zich hier: Forum » Tutorials » [PHP] Captcha
   Actief Topic: [PHP] Captcha

Vorige ( 1 ) Volgende

superkluns
Tester
avatar
# Gepost op 09-11-2009 20:01
Bewerkt door superkluns op 11-08-2010 11:54


Je kent het vast wel: je wilt bv. een nieuwe mail aanmaken en dan moet je zo'n code overtypen van een plaatje. Dat is captcha en dat kun je zelf ook maken. Ik ga hier een poging doen om uit te leggen hoe. Enige voorkennis van html en php is wel vereist.

Een voorbeeld is te vinden op: http://moehahahaha.netau.net/voorbeeld/captcha/. Om de brondcode te zien, moet je "?bron" achter de URL zetten.

Inhoudsopgave

  1. Het plaatje
  2. Het formulier
  3. De controle
  4. Tot slot


Top

Het plaatje


Om het plaatje met de random code te maken, maken we het bestand 'captcha.php' met daarin:
- er wordt een random, 4 tekens lange code gegenereerd.
- deze code wordt (gecodeerd) in een sessie-variabele gezet EN omgezet in een plaatje
- tenslotte wordt het plaatje naar de browser verzonden en een stukje code die ervoor zorgt dat het plaatje niet in de cache terecht komt.

captcha.php
Plain | Plain new window | PHP code:
  1. <?php
  2.  
  3. // het random nr. aanmaken en gecodeerd opslaan in php sessie
  4.  
  5. $CharList="234578qwertyuipasdfhjklzxcvnm";
  6. for ($cnt=1;$cnt<=4;$cnt++) {
  7. $randomnr .= $CharList[mt_rand(0,strlen($CharList)-1)];
  8. }
  9.  
  10. $_SESSION['captcha'] = md5($randomnr);
  11.  
  12. // captcha plaatje met nummer maken - afmetingen kun je aanpassen gebruikte font
  13.  
  14. $im = imagecreatetruecolor(100, 35);
  15.  
  16. // Kleurenbepaling
  17.  
  18. $white = imagecolorallocate($im, 255, 255, 255);
  19. $grey = imagecolorallocate($im, 128, 128, 128);
  20. $black = imagecolorallocate($im, 0, 0, 0);
  21.  
  22. // zwarte rechthoek tekenen - afmetingen kun je aanpassen aan verschillende fonts
  23.  
  24. imagefilledrectangle($im, 0, 0, 200, 35, $black);
  25.  
  26. // een ttf-bestand toevoegen
  27.  
  28. $font = 'ITCBLKAD.TTF';
  29.  
  30. // schaduw toevoegen
  31.  
  32. imagettftext($im, 35, 0, 22, 24, $grey, $font, $randomnr);
  33.  
  34. // randomnr. toevoegen
  35.  
  36. imagettftext($im, 35, 0, 15, 26, $white, $font, $randomnr);
  37.  
  38. // voorkomen dat afbeelding ge-cached wordt
  39.  
  40. header("Expires: Wed, 1 Jan 1997 00:00:00 GMT");
  41. header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
  42. header("Cache-Control: no-store, no-cache, must-revalidate");
  43. header("Cache-Control: post-check=0, pre-check=0", false);
  44. header("Pragma: no-cache");
  45.  
  46. // plaatje verzenden naar browser
  47.  
  48. header ("Content-type: image/gif");
  49. imagegif($im);
  50. ?>


Zoals je misschien al gezien hebt, wordt in deze code gebruik gemaakt van het bestand ITCBLKAD.TTF. Zorg ervoor dat dit bestand in dezelfde map staat als captcha.php.
Download: http://moehahahaha.netau.net/voorbeeld/captcha/ITCBLKAD.TTF

Top

Het formulier


Stel dat je de captcha wilt gebruiken bij een inlog-formulier, dan zou die er als volgt uit zien:
Plain | Plain new window | HTML code:
  1. <form method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
  2. <input type="hidden" name="actie" value="inloggen" />
  3. Gebruikersnaam: <input type="text" name="gebruikersnaam" /><br />
  4. Wachtwoord: <input type="password" name="wachtwoord" /><br />
  5. Typ hier code over die op het plaatje staat.<br />
  6. Er zijn alleen kleine letters en cijfers.<br />
  7. <img name="captcha" src="captcha.php" alt="captcha-plaatje" /><br />
  8. <input type="text" name="captcha_code" /><br />
  9. <input type="submit" value="inloggen" />
  10. </form>

captcha.php is dus gewoon een plaatje. Je moet dit dus niet includen ofso, gewoon als src opgeven van de img-tag.
En voor de mensen die het niet weten: De action in regel 1 houd in dat de huidige pagina als action wordt genomen. Je kunt hier natuurlijk ook een andere pagina voor kiezen.

Het kan natuurlijk voorkomen dat je net dat ene plaatje krijgt waar je ff niet weet wat er nou staat. Dan is het best handig om het plaatje te vernieuwen. Dat kan met deze javascript-functie:
Plain | Plain new window | Javascript code:
  1. function change_captcha() {
  2.   var captcha = document.images.captcha
  3.   var src = captcha.src.split('?');
  4.   captcha.src = src[0] + '?' + Math.random();
  5. }

Zet deze code in de head van je pagina. Voor de beginnelingen onder ons:
plak deze code in de head:
Plain | Plain new window | HTML code:
  1.  
  2. <script type="text/javascript">
  3. //vervang dit door de code die ik zojuist heb gegeven.
  4.  

Let er wel op dat de img-tag met het captcha-plaatje ook de naam 'captcha' heeft!
Deze javascript-functie kan op 2 manieren worden aangeroepen. Met een knop, of met een link.
Een knop
Plain | Plain new window | HTML code:
  1. <input type="button" onclick="change_captcha()" value="Ander plaatje" />

Een link
Plain | Plain new window | HTML code:
  1. <a href="javascript:void(0);" onclick="change_captcha()">Ander plaatje</a>


Top

De controle


Er moet natuurlijk wel worden gecontroleerd of de code goed is ingetypt. Om dat te controleren moet je controleren of de ingevoerde waarde overeenkomt met de sessie-variabele die we hebben aangemaakt. Maar aangezien we hem met md5-codering hebben opgeslagen, moeten we ingevoerde waarde ook eerst coderen:
Plain | Plain new window | PHP code:
  1. if (md5($_POST['captcha_code']) == $_SESSION['captcha']) {
  2. //code als captcha goed is overgetypt
  3. } else {
  4. //code als captcha niet goed is overgetypt
  5. }


Vergeet niet bovenaan de pagina waar deze code staat 'session_start()' te zetten, anders werkt het niet. En met bovenaan de pagina bedoel ik ook echt helemaal bovenaan, dus de eerste regel van de pagina, nog voor het doc-type enzo.

Als er alleen iets moet gebeuren als de code niet goed is overgetypt, een fout genereren bijvoorbeeld, dan krijg je deze code:
Plain | Plain new window | PHP code:
  1. if (md5($_POST['captcha_code']) != $_SESSION['captcha']) {
  2. //fout genereren
  3. }


Top

Tot slot


Dit was het begin van de tutorial. Er komen nog updates, dus houd deze pagina in de gaten.

Updates
- De 'ik kan het plaatje niet lezen, verander het plaatje'-knop op 14-11-2009 om 21:20
- De bovengenoemde knop verbeteren om 11-08-2010 om 11:54
geplande updates:
- captcha-beveiliging inbouwen in het mailformulier van vlerknozem

Vorige ( 1 ) Volgende

U moet aangemeld zijn om een reactie te kunnen plaatsen.

Indien u nog geen account heeft kunt u zich hier registreren.



© copyright 2009/2010 WebProjects 1.02 - Template van Sebastaan Franken