Tux RSS-IconHallo, und willkommen auf meinem Blog!
Falls du hier neu bist und dir gefällt was ich schreibe, dann abonniere am besten meinen RSS-Feed um auf dem Laufenden zu bleiben.
Was das ist kannst du hier erfahren.

Link 24.10.10, 21:12:32

Spamkommentare per Zeitmessung erkennen

Vor kurzem habe ich mich ja schon darüber aufgeregt, dass Spambots meinen Blog heimsuchen und wollte wissen wie und warum. Dazu habe ich dann erstmal den Spamschutz ausgeschaltet, um zu schauen, wie viel Spam hier so täglich aufschlägt. Der Spamschutz funktionierte im Grunde genommen so:
Ein per CSS verstecktes Formularfeld darf nicht ausgefüllt werden, sonst wird der Kommentar nicht akzeptiert. Die meisten Bots befüllen nämlich automatisiert jedes Formularfeld mit ihrem Gebrabbel und sind dadurch dann identifizierbar. Dieses Eingabefeld ist natürlich sinnvoll benannt, so dass die Roboter nicht bemerken, dass es sich hierbei um eine Falle handelt. Neuerdings funktioniert dieser Spamschutz leider nicht mehr so recht, da wohl eine andere Art von Bot auf meine kleine Seite aufmerksam geworden ist. Diese agiert aus irgendwelchen Gründen schlauer im Befüllen von Eingabefeldern und rutscht somit durch den Filter.
Jedenfalls musste ich mir eine neue Methode suchen, um unerwünschte Kommentare im Voraus zu erkennen und nicht in die Datenbank einzutragen, damit ich sie dann manuell löschen muss. Die hab ich dann auch gefunden:
Diese Strategie beruht darauf, dass Bots — im Gegensatz zu menschlichen Benutzern — nicht eine halbe Ewigkeit brauchen um ein lächerliches kleines Formularfeld auszufüllen und abzuschicken. Also muss man nur irgendwie herausfinden, wie lange der Zeitraum zwischen dem Laden der Seite mit dem Formular und dem Abschicken desselbigen ist. Dazu empfiehlt es sich den Zeitpunkt des Seitenaufrufs in ein verstecktes Formularfeld schreiben, beim Absenden zu übergeben, um ihn dann mit der aktuellen Uhrzeit zu vergleichen. Danach muss noch überprüft werden, ob die benötigte Zeit typisch für einen Bot ist oder nicht, und dementsprechend gehandelt.
So sieht das verstecke Eingabefeld aus:

<form action="example.php" method="post"> <input name="zeit" type="hidden" value="<?php echo time(); //Hier wird die Zeit gespeichert ?>" readonly> <input type="submit" value="Abschicken" > </form>
Das "readonly" stellt sicher, dass der Benutzer den Wert des Feldes nicht verändern kann, "type="hidden"" versteckt das Feld, damit es nicht nervt.
Jetzt muss lediglich noch ausgewertet werden, wie groß die verstrichene Zeit zwischen Aufruf und Absenden ist.

example.php:
<?php $posted = $_POST['zeit']; if (isset($posted) && is_numeric($posted)) { //überprüfen ob der Wert eine Zahl ist $sendezeit = (time() - $posted); //verstrichene Zeit if ($sendezeit < 10 || $sendezeit > 36000) { //weniger als 10 Sekunden oder mehr als 10 Stunden? //10 Stunden deshalb, weil manche Bots auch extrem zeitverzögert absenden $text = "Gerade wurde der Kommentar in $sendezeit Sekunden zugespammt"; mail('admin@example.com', 'Abgewehrter Kommentarspam', $text); //Extra-Gimmick: Bei abgewehrtem Spamversuch E-Mail versenden die("Du hast das Formular zum Kommentieren in weniger als 10 Sekunden ausgef&uuml;llt, das ist ziemlich schnell.<br> Deswegen bist du vermutlich ein Bot und kein Mensch. Bots sind hier nicht erw&uuml;nscht. Menschen schon. Falls du kein Bot bist gehe bitte eine Seite zur&uuml;ck und warte ein paar Sekunden, so dass meine Automatisiertekommentarabsenderdetektiermaschine nicht anschl&auml;gt. Danke :) //Abbruch + Fehlermeldung, damit menschliche Besucher mit schnellen Fingern nicht vor einem Rätsel stehen } } //Wenn der Kommentar kein Spam ist geht es hier ganz normal weiter und die Daten werden in die DB eingetragen //... ?>
Diese Methode habe ich jetzt mit der "Verstecktes-Eingabefeld-Methode" kombiniert und bereits einige Spamversuche erfolgreich durchkreuzt. Wenn mich die vielen Mails irgendwann nerven sollten schalte ich die Funktion ab :)

tags:#spam #blog #php


Share

Kommentare:



Kommentare erscheinen erst nach der Freigabe unter einem Blogpost.
HTML ist nicht erlaubt.




(optional, nur falls du bei neuen Kommentaren benachrichtigt werden willst)