Einfaches Captcha-System mit PHP Zurück zur Übersicht
Über den Autor
Hallo,
Da es oft sehr praktisch ist (z.B. für ein Gästebuch), poste ich hier ein kleines Tutorial, wie man ein einfaches Captcha-System realisiert. Dass diese Variante nicht vollständig sein kann, ist hoffentlich allen klar. Sie ist nur als Grundlage edacht und kann leicht erweitert werden (z.B. weitere Verfremdung, Buchstaben in einzelnen Bldern, etc.).
Vor dem Einsatz des Skripts muss ein Unterordner "saved_captchas" erstellt werden, in dem später die einzelnen Bilder abgelegt werden. Das Löschen der temporären Bilder nach einer bestimmten Zeit habe ich mir jetzt mal gespart
Hier nun der Code der index.php, ich denke, er ist selbsterklärend (mit seinen massenhaften Kommentaren):
PHP-Code:
<?php echo "<?xml version="1.0" ?>"; //Geht leider nicht anders (sonst PHP-Fehler) ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html > <head> <title>Einfache Captcha</title> </head> <body> <?php $case_sensitive = false; //Groß- und Kleinschreibung unterscheiden, hier ausgeschaltet //Überprüfen, ob das Formular bereits abgesendet wurde { //Formular wurde noch nicht abgesendet //Zuerst wird der Text der Captcha generiert: $chars = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z,1,2,3,4,5,6,7,8,9"; //Mögliche Zeichen $chars = explode(",", $chars; //In Array umandeln (Wichtig: Der Array sollte mehr Einträge haben als die Captcha lang ist!) $captchalength = 5; //Spätere Länge der Captcha in Zeichen festlegen $captchatext; //Variable für den Text der Captcha for($i = 0; $i < $captchalength; $i += 1 { $captchatext .= $chars[$i]; //Der Captcha Zeichen hinzufügen } //Erstellen des Captcha-Bildes: $fontsize = 4; //Schriftgröße für die Captcha festlegen $captchawidth = imagefontwidth($fontsize * $captchalength; //Breite des späteren Captcha-Bildes berechnen //Mögliche Zeichenfarben festlegen (Wichtig: Die Arrays müssen mindestens so viele Einträge haben, wie die Captcha lang ist!): //Zeichen für Zeichen einzeln in das Bild zeichnen: for($i = 0; $i < $captchalength; $i += 1 { $charcolor = imagecolorallocate($captchaimage, $colors_r[$i], $colors_g[$i], $colors_b[$i]); //Farbe der Schrift festlegen imagestring($captchaimage, $fontsize, 2 + imagefontwidth($fontsize * $i, 2, substr($captchatext, $i, 1, $charcolor; //Das Zeichen zeichnen } //Bild tempörär abspeichern: //Rechte für die Bild-Datei ändern, damit Zugegriffen werden kann: ?> <form method="post" action="index.php"> <!-- Falls die Datei anders heißt, hier den Namen der Datei ändern --> <input type="hidden" name="rightcaptcha" id="rightcaptcha" value="<?php if($case_sensitive == false {echo md5(strtolower($captchatext); }else{echo md5($captchatext; }?>" /> <table> <tr> <td colspan="2">Bitte tippen Sie diese Zeichenfolge ab:</td> </tr><tr> <td><img src="saved_captchas/captcha_<?php echo md5($_SERVER['REMOTE_ADDR']); ?>.png" alt="captcha" /></td> <td><input type="text" name="captcha_user" id="captcha_user" maxlength="<?php echo $captchalength; ?>" /></td> </tr><tr> <td colspan="2"><input type="submit" name="submit" id="submit" value="OK"></td> </tr> </table> </form> <?php }else{ //Formular wurde bereits abgesendet -> Eingabe überprüfen $captcha_ok = false; //Eingabe richtig //Überprüfen der Eingabe: $captcha_user = $_POST['captcha_user']; //Eingabe des Benutzers $captcha_right = $_POST['rightcaptcha']; //Richtiger Text (MD5-Verschlüsselt) if($case_sensitive == true { { $captcha_ok = true; } }else{ { $captcha_ok = true; } } //Ausgabe (hier natürlich vereinfacht): if($captcha_ok { echo "Die Eingabe war richtig!"; }else{ echo "Die Eingabe war falsch!"; } } ?> </body> </html>
Ich habe hier die Null und das große O als Möglichkeiten weggelassen, da die sich sehr ähneln und eine EIngabe erschweren würden. Wie gesagt, ich denke, dass sich das Skript gut erweitern lässt...
Ich hoffe, euch nutzt das Tutorial etwas!
grüssse
g.
EDIT: Ich hab den Code nochmal kurz geändert (Wegen eines kleinen Fehlers, der u.U. verhindern kann, dass das Bild auch angezeigt wird)
Für alle, die sich das erstmal anschauen wollen, gibt es hier ein kleines Beispiel.