Hinweis: Die hier gezeigte Methode um Spam zu verhindern ist in dieser Form nicht 100%ig sicher und kann mit entsprechenden Kenntnissen recht einfach umgangen werden. Gegen normale Bots hilft diese Methode aufgrund der recht geringen Verbreitung meist trotzdem.
Eine Überarbeitung des Artikels ist in Arbeit.
Spambots, die Formulare, Gästebücher und Foren zumüllen nehmen immer weiter zu. Eine Möglichkeit diese "Maschinen" auszusperren besteht zum Beispiel in der äußerst beliebten "Captcha"-Methode. Dabei wird unterhalb des Formulars ein kleines Bild mit einer Buchstaben- und Zahlenfolge ausgegeben, die der (menschliche) Benutzer in ein passendes Feld eintragen muss. Nur wenn die Kombination richtig eingegeben wird, werden die Daten des Formulars eingetragen oder abgesendet.
Mit diesem kleinen Codeschnipsel soll hingegen eine andere Möglichkeit gezeigt werden. Und zwar wird ganz einfach eine kleine Rechenaufgabe gestellt, die der Benutzer lösen muss und dessen Ergebnis er in ein entsprechendes Feld eingeben muss.
Das ganze wird am Beispiel eines kleinen Formulars gezeigt.
Zuerst erstellen wir uns eine Zufallszahl zwischen 1 und 3. Anhand dieser Zufallszahl wird später unsere Rechenoperation bestimmt (also Addition, Subtraktion oder Multiplikation): $oprand = mt_rand(1,3);
Mit der nun folgenden Switch-Anweisung unterscheiden wir die 3 möglichen Fälle.
Um die Rechenaufgaben möglichst einfach zu gestalten generieren wir auch für jeden der drei Fälle andere Zahlen:
- switch($oprand) { case 1: $gl1 = mt_rand(1,20); //Zufallszahl zwischen 1 und 20 $op = "+"; //Rechenoperator für die Ausgabe später $gl2 = mt_rand(1,10); //Zweite Zufallszahl zwischen 1 und 10 //Anschließend wird das Ergebnis mit PHP berechnet und in einem MD5-String verwandelt. Dieser wird später im Formular zur nötigen Kontrolle übergeben. $loesungmd5 = md5($gl1+$gl2); break; case 2: //Entsprechend der ersten Operation. Das Zahlenspektrum der Zufallszahlen wurde jedoch anders gewählt. $gl1 = mt_rand(10,30); $op = "-"; $gl2 = mt_rand(1,$gl1); $loesungmd5 = md5($gl1-$gl2); break; case 3: //Siehe case 1 und case 2 $gl1 = mt_rand(2,10); $op = "x"; $gl2 = mt_rand(2,6); $loesungmd5 = md5($gl1*$gl2); break; }
Anschließend folgt in HTML das entsprechende Formular. Zum Beispiel:
- <form action="<?PHP echo $PHP_SELF; ?>" method="post"><table border="0" width="90%">
- <tr><td align="right"><b>Ihre E-Mail-Adresse*:</b></td><td><input type="text" name="email" size="33" /></td></tr>
- <tr> <td align="right"><b>Nachricht*:</b></td> <td><textarea name="text" rows="10" cols="40" style="font-family:Verdana, Arial, Helvetica, sans-serif;"></textarea></td></tr>
- <!--An dieser Stelle werden die beiden Gleichungsvariablen und der Rechenoperator via PHP ausgegeben--><tr> <td align="right"><b>Spamschutz*:</b></td> <td>Bitte lösen Sie die Gleichung: <?PHP echo $gl1." ".$op." ".$gl2; ?> = <input type="text" name="gleichung" size="4" /></td></tr>
- <tr><td align="right"> <input type="hidden" name="include" value="contact" /> <input type="hidden" name="action" value="mail" /><!--In einem "hidden-field" wird die Lösung der Gleichung als MD5-String zur späteren Überprüfung übergeben. --> <input type="hidden" name="glloesung" value="<?PHP echo $loesungmd5; ?>" /> <input type="reset" class="input" value="Inhalte Löschen" /></td><td align="right"><input type="submit" class="input" value="Abschicken" /></td></tr>
- </table></form>
Jetzt fehlt noch die Überprüfung des Formulars. Dazu fügen wir am Anfang der entsprechenden PHP-Datei (noch vor dem was wir bisher erstellt haben!) folgendes ein:
- <?PHP//Hier wird überprüft, ob das Formular überhaupt abgesendet wurde und ob das vom Benutzer eingegebene Ergebnis stimmt. Dazu wird das vom Benutzer einggegebene Ergebnis ebenfalls in einem MD5-String gewandelt und mit dem im Formular übergebenen Vergleichsstring verglichen.if(isset($_POST['action']) && $_POST['action'] == "mail" && isset($_POST['gleichung']) && md5($_POST['gleichung']) == $_POST['glloesung']) { //Gewünschte Operation, die mit dem Formular durchgeführt werden soll. }//Sollte das vom Benutzer errechnete Ergebnis nicht stimmen wird folgende Meldung ausgegeben:elseif(isset($_POST['action']) && $_POST['action'] != "") { echo "<p align=\"center\"><b>Sie haben nicht alle nötigen Felder ausgefüllt oder die Gleichung nicht richtig gelöst.<br /> Bitte gehen Sie <a href=\"javascript:history.back()\">zurück</a>.</b></p>"; }?>
Das Formular kann jetzt natürlich noch um beliebige weitere Felder erweitert werden.
Eine Beispieldatei dieses Codeschnipsels ist im Anhang zu finden.
Dieser Beitrag ist unter der Creative Commons Namensnennung 2.0 Deutschland lizensiert. Bearbeitung, Nutzung & Verbreitung ist ausdrücklich gestattet.