Sicherheitsbilder (Captchas) gegen SPAM - Die Klasse
Erstellt am 21.10.2008 um 10:22 Uhr von sim4000
So. Nun beschäftigen wir uns mal mit der Klasse. Diese benötigt meine MySQL Verbindungsklasse, damit alles richtig Funktioniert. Ansonsten, müsste man alles was mit SQL zu tun hat, anpassen.
komplette Klasse
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | /** * Klasse zur Nutzung von Captchas * @author Christian Blechert * @since Septemper 2008 * */ class captcha { private $fontsize; private $fontfile; private $imagefile; private $align; function __construct($align="right") { $this->fontsize = 11; // Schriftgroesse $this->fontfile = "/captcha/VeraMono.ttf"; // absoluter Pfad zur Schriftfile $this->imagefile = "/captcha/captcha.png"; // absoluter Pfad zur Bilddatei $this->align = $align; // Ausrichtung } // Token generieren function getToken() { $db = new mysql(); $token = md5(time().mt_rand(0, 9999999)); $db->mysqlQuery("insert into captcha_sessions set token='".$db->sqlij($token)."', ip='".$_SERVER['REMOTE_ADDR']."', dtime=NOW(), value='".md5(time())."'"); return $token; } // alte Tokens loeschen function deleteTokens() { $db = new mysql(); $db->mysqlQuery("delete from captcha_sessions where dtime<FROM_UNIXTIME(".(time()-132000)).")"); } // Eingaben ueberpruefen function checkValue($value, $token) { $db = new mysql(); $db->mysqlQuery("delete from captcha_sessions where token='".$db->sqlij($token)."' and value='".$db->sqlij($value)."' and ip='".$_SERVER['REMOTE_ADDR']."'"); if($db->mysqlAffectedRows()<1) { return false; } else { return true; } } // Captcha ausgeben function getCaptcha() { $this->deleteTokens(); $token = $this->getToken(); echo "<a class='captcha' href=\\\\"javascript:reloadImage('captcha');\\\\" title='Captcha neu laden'><img class='captcha' src='".REL_PATH."img/icons/reload.gif' alt='Captcha neu laden'></a> "; echo "<a class='captcha' href=\\\\"javascript:reloadImage('captcha');\\\\"><img id='captcha' class='captcha' src='".REL_PATH."etc/captcha/captcha.php?token=".$token."' alt='Captcha'></a>"; echo "<input type='hidden' name='captcha_token' value='".$token."'>"; } // Bild generieren function getPicture($token) { $math[0] = " "; $math[1] = "-"; $math[2] = "*"; $math[3] = ":"; $math = $math[mt_rand(0, sizeof($math)-1)]; switch($math) { case " ": $wert1 = mt_rand(1, 20); $wert2 = mt_rand(1, 20); $value = $wert1 $wert2; break; case "-": $wert1 = mt_rand(10, 99); $wert2 = mt_rand(0, 9); $value = $wert1-$wert2; break; case "*": $wert1 = mt_rand(1, 5); $wert2 = mt_rand(1, 5); $value = $wert1*$wert2; break; case ":": $wert2 = mt_rand(2, 9); $wert1 = mt_rand(2, 9); $wert1 = $wert1*$wert2; $value = $wert1/$wert2; break; } $db = new mysql(); $result = $db->mysqlQuery("update captcha_sessions set value='".$db->sqlij($value)."' where token='".$db->sqlij($token)."' and ip='".$_SERVER['REMOTE_ADDR']."'"); if($db->mysqlAffectedRows()<1) die("Unknown Token!"); if($this->align=="left") { $text = "= ".$wert1." ".$math." ".$wert2; } else { $text = $wert1." ".$math." ".$wert2." ="; } header('Content-type: image/png'); $img = ImageCreateFromPNG($this->imagefile); $angle = rand(0,5); $t_x = mt_rand(0, 16); for($i=0; $i<strlen($text); $i ) { $rgb[0] = mt_rand(0, 100); $rgb[1] = mt_rand(0, 255); $rgb[2] = mt_rand(0, 100); $t_y = mt_rand(13, 15); $color = ImageColorAllocate($img, $rgb[mt_rand(0, sizeof($rgb)-1)], $rgb[mt_rand(0, sizeof($rgb)-1)], $rgb[mt_rand(0, sizeof($rgb)-1)]); //Farbe imagettftext($img, $this->fontsize, $angle, $t_x, $t_y, $color, $this->fontfile, substr($text, $i, 1)); if(substr($text, $i 1, 1)==" ") $t_x =2; else $t_x =10; } imagepng($img); imagedestroy($img); } } |
Nun mal eine kurze Übersicht, aus was die Klasse besteht.
Dem Konstruktor wird die Ausrichtung des "=" Zeichen übergeben. Je nachdem ob "left" oder "right" übergeben wird, steht das "=" Zeichen links oder rechts. Des weiteren wird im Konstruktor die Schriftgröße des Captchas, der absolute Pfad zur Schriftarten-Datei und der absolute Pfad zum png-Bild wo die Aufgabe "aufgedruckt" wird festgelegt.
Die Methoden
- getToken
Mit dieser Methode wird ein neues Token in der Datenbank erstellt. - deleteTokens
Hier werden alle Tokens die älter als eine Woche sind gelöscht. - checkValue
Hier wird die Eingabe mit dem Wert in der Datenbank verglichen. Wenn der Wert richtig ist, wird der Datensatz automatisch gelöscht. - getCaptcha
Eine Methode, um die integration in ein Formular zu erleichtern. Diese kann nach belieben angepasst werden. - getPicture
Die Methode generiert das Captcha, und wird in der img-Datei verwendet.




