Spamschutz durch mathematische Gleichung

  • 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):
    [PHP]mt_srand((double)microtime() * 1000000);
    $oprand = mt_rand(1,3);[/PHP]
    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:
    [PHP]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;
    }[/PHP]
    Anschließend folgt in HTML das entsprechende Formular. Zum Beispiel:


    [PHP]<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>[/PHP]


    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]<?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>";
    }
    ?>[/PHP]


    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.

  • Hallo Michael,
    Endlich das Script das ich gesucht habe!
    Ich bin ein Anfänger was PHP angeht.
    Nun meine Frage:
    Wie gebe ich nun meine mail() Angaben an damit das Formular auch an mich geschickt wird... Du hast eine Abfrage ob die Rechnung richtig und wenn Sie richtig ist was dann...
    Dass habe ich nicht gerafft :D


  • Hallo,


    um das Formular letztendlich abzuschicken musst du an der angegebenen Stelle den dafür nötigen Code einfügen:

    Code
    1. //Gewünschte Operation, die mit dem Formular durchgeführt werden soll.


    Ein Beispiel dafür ist u.a. hier zu finden.


    MfG,
    Michael Lorer

  • Hallo Michael,
    ich habe mächtig Spamprobleme in einem etwas älteren Gästebuch, schu mal hier ...
    http://www.bernis-board.de/gbook.php?action=show&sid=


    Musste aus diesem Grund (Einträge sind sofort freigeschaltet, habe keine Option dies zu ändern) das Gästebuch deaktivieren.


    Meinst Du man könnte Deine Idee hier irgendwie integrieren?


    Gruß vom Berni* :) :]

  • Hallo,


    prinzipiell ist es möglich den Spamschutz auch in dieses Gästebuch zu integrieren.
    Wie das im Detail jedoch geht kann ich dir leider nicht sagen, da ich die Gästebuch-Software nicht kenne.


    MfG,
    Michael Lorer

  • Herzlichen Dank für Deine Hilfsbereitschaft Michael ! :)


    Da ich nicht mehr weiss ob ich in den letzten Jahren daran rumgefummelt habe, ;) hänge ich dir nicht die Original-Dateien, sondern die gbook.php wie sie im Root liegt an. Die Templates habe ich exportiert. Eigentlich sind auch noch einige acp-Templates und eine admin_gb.php dabei. Die brauchst Du nicht, oder?



    Hab da noch ein kleines Problem:
    Falls ein User in seinem Profil "e-Mail Adresse nicht anzeigen" gewählt hat !!


    Ist er im Forum angemeldet und schreibt einen Beitrag ins GB, wird der Username und alles andere, also Homepage und e-Mail im GB übernommen. Könnte man das nicht irgendwie deaktivieren, damit die e-Mails der User nicht angezeigt werden (Homepage kann ja bleiben)? Bei Gästen ist es egal, sie müssen die Option e-Mail nicht ausfüllen, bzw. das Eingabefeld dafür kann ich deaktivieren. Nur bei Mitgliedern kann ich nichts machen, die Mailadressen stehen immer drin, ist ärgerlich.



    Wenn Du das hinbekommst kann ich das GB wieder in vollem Umfang nutzen. Ist nämlich super das Teil, gibts auch für die neueren Boardversionen nicht mehr.



    LG vom Berni* :)

    Dateien

    • gb.zip

      (14,67 kB, 1.172 Mal heruntergeladen, zuletzt: )

    S` gibt Badische un` unsymbadische

    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von Berni* ()

  • Zitat

    Original von Berni*
    Fehlermeldung:


    Parse error: syntax error, unexpected T_BOOLEAN_AND in /is/htdocs/wp1013255_M4HIDHSQUC/www/gbook.php on line 370


    uups


    --
    Funktionierts aber ansonsten?

  • Ja Michael, das GB funktioniert ansonsten.


    Der Error ist nun weg. Aber die Gleichung wird ignoriert, man kann also eintragen ohne die Lösung eigegeben zu haben. Da muss auch noch ein kleiner Scriptfehler im gb_input_eingabe.tpl sein, mit dem IE wird in der Statuszeile Fehler angezeigt. ?( 8o


    Schau am besten selber mal ...
    http://www.bernis-board.de/gbook.php?action=show&sid=


    ... kannst auch mal als Gast schreiben, habe es zum testen aktiviert.

  • Jetzt scheint es zu gehen, aber wenn die Lösung nicht eingegeben wird kommt immer ...


    Fehlermeldung
    Sie können nicht mehrere Einträge in kurzer Zeit hintereinander erstellen.


    ... obwohl diese Sperre deaktiviert ist.


    Glaube ich kann auch die Einträge nicht mehr editieren, muss nochmal schauen.

  • Fehlermeldung habe ich im gb_input_error1.tpl geändert ...


    Vermutlich hast Du den Spamschutz übersehen, löse bitte die Gleichung unterhalb vom Eingabefeld. Außerdem kannst Du nicht mehrere Einträge innerhalb von 60 Sekunden hintereinander erstellen.


    ... so kann mans lassen denke ich!?



    Wenn jetzt das Editieren noch klappt haben wirs Michael ! :]