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üllt, das ist ziemlich schnell.<br>
Deswegen bist du vermutlich ein Bot und kein Mensch. Bots sind hier nicht erwünscht. Menschen schon.
Falls du kein Bot bist gehe bitte eine Seite zurück und warte ein paar Sekunden,
so dass meine Automatisiertekommentarabsenderdetektiermaschine nicht anschlä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
Spam, spam, spam, spam, spam? und so
Gestern habe ich probeweise mal meinen Spamschutz hier auf dem Blog deaktiviert, um zu schauen ob er überhaupt notwendig ist. Vorweg: Ja, offensichtlich ist er das. Den Schutz hatte ich damals in der Entwicklungphase des Blogs nur vorsichtshalber eingebaut, obwohl ich da nie vermutet hätte, dass er irgendwann mal notwendig sein würde.
Kurz nachdem gestern der Schutz ausgeschaltet war kam es dann Schlag auf Schlag: Gleich in der ersten halbe Stunde trudelten zwei eindeutig als Spam zu identifizierende Kommentare ein. Im Laufe des Tages kamen dann nochmal zwei Exemplare hier an und heute morgen noch eines. Offensichtlich wurden die Kommentare automatisiert abgesendet, deshalb frage ich mich: Wie? Und warum?
Ich meine, wie läuft das ab? Durchsuchen diese Bots automatisch das Internet nach Eingabeformularen und entladen ihre nervigen, mitunter sinnlosen Werbenachrichten dort? Oder werden von einer Person einzelne Webseiten, von denen sie denkt, dass sie anfällig sind in eine Liste eingetragen, die die Roboter dann selbstständig abgrasen? Falls letzteres der Fall ist: Denkt diese Person wirklich, dass es sich lohnt Werbung hier auf meiner Seite, die im Monat höchstens Hundert Klicks bekommt, zu verbreiten? Oder generell gefragt: Lohnt es sich überhaupt Spam auf Webseiten oder in Foren zu verbreiten? Wer klickt da schon auf Links, vor allem wenn daneben in schlechtem Englisch irgendwas über Viagra, Penisvergrößerungen und Konsorten zusammengelogen wird? Kann man also von der Verbreitung von Spam leben? Heutzutage gibt es doch kaum noch Blogs, Foren oder Webseiten die keinen Schutz vor Spamming haben, oder nicht? Und was ist so lukrativ daran zufallsgenerierte URLs hier in meinem Blog zu verbreiten?
Glücklicherweise bin ich von diesem Problem im Moment nicht oder nur sehr wenig betroffen, da ich die Kommentare sowieso erst freischalten muss bevor sie jeder sehen kann. Dennoch hat es mich genervt, als gestern die 5 Spams als Mail bei mir eintrudelten und ich sie händisch aus der Datenbank löschen musste. Für den Fall, dass der Spammer der verantwortlich ist, dass meine Seite in das Ziel von Bots geraten ist, hier mitliest:
Es bringt nichts, gibs auf. Ich weiß natürlich, dass die ganze Sache ein Riesengeschäft für dich ist und es dir sicherlich scheißegal ist, ob auf einer Webseite von Tausenden der Spam seine Wirkung entfaltet oder nicht.
Spam zurückverfolgen
Um Spam zurückzuverfolgen gibt es eine Methode die zumindest bei Google Mail funktioniert. Wer über andere Anbieter Bescheid weiss, die die im Folgenden beschriebene Methode unterstützen meldet sich bitte in den Kommentaren zu Wort.
Eine Möglichkeit um Werbemails zurückzuverfolgen, d.h. herauszufinden wer den Spammern die Emailadresse zukommen hat lassen, ist es für jeden Dienst eine eigene Mailadresse zu besitzen. Logischerweise wird das ein ziemlicher Umstand, wenn man sich irgendwo anmelden möchte und man muss davor erstmal einen neuen Mailaccount anlegen. Einfacher geht es mit solchen Diensten wie trash-mail.com. Da muss man dann aber immer nachschauen ob neue Mails angekommen sind und außerdem haben noch andere Leute Zugriff auf den Posteingang.
Noch viel einfacher und schneller geht es mit - ich nenne sie einfach mal so - Emailparametern.
Beispiel:
Mir gehört die Adresse beispiel@googlemail.com (in echt gehört mir diese Adresse natürlich nicht). Ich will jetzt einen Account bei Twitter registrieren, um zu schauen ob Twitter meine Emailadresse verkauft oder ob jemand sie sich aus der Datenbank gestohlen hat, gebe ich bei der Registrierung als Mailadresse beispiel+twitter@googlemail.com an. Die Mails werden dann ganz normal im Posteingang bei GMail landen, aber man kann herausfinden an welche Adresse genau die Mail geschickt wurde. Außerdem kann man sich so bei einigen Diensten mehrmals anmelden, ohne mehrere Adressen verwalten zu müssen. (Zum Beispiel bei Lockerz um mehr "Pointz" durch Einladungen zu bekommen, was jedoch nicht erlaubt ist.)
Es wird hoffentlich nicht vorkommen, dass Twitter meine Mail an Dritte weiterreicht, aber Fefe hat da mal über einen Fall bei K&M geschrieben.