Die erste Nacht nach meiner neuen WordPress Installation ließ mich etwas an meiner entscheidung zweifeln die richtige Blog-Software gewählt zu haben.
Am Morgen waren 80 Spam Kommentare aufgelaufen.
Nach einer kurzen Recherche fand ich heraus, dass es fertige anti-Spam Plugins für WordPress gibt. (Mit Captchas wollte ich niemanden quälen.) Der Nachteit dieser Plugins ist allerdings, dass sie andere Server kontaktieren müssen für ihre Entscheidung, ob ein Kommentar Spam ist oder nicht.
Was lag also näher als sich an einem eigenen Spam-Schutz zu versuchen? Schließlich bin ich PHP-Programmierer!

Bot versendet POST
Die Erste Maßnahme sollte sein, die dümmsten Bots auszuschließen. Dazu muss das Kommentar-Formular so prepariert werden, dass ein Kommentar nur dann eingestellt werden kann, wenn es erwiesenermaßen mit diesem Formular verschickt wurde. Dazu wird eine Session in WordPress eingebaut und beim Laden des Formulars ein Zufallswert in die Session und in das Formular geschrieben. Wenn der Kommentar gespeichert werden soll, wird der Wert aus dem verschickten Formular mit dem Wert in der Session verglichen.
Das war schon etwas aufwändig zu programmieren, hatte aber kaum den erwünschten Erfolg. Der Posteingang klingelte noch immer alle halbe Stunde. Scheinbar sind die Bots nicht so simpel gestrickt, sie schicken nicht ein eigenes POST an das verarbeitende Script, sondern rufen zuerst das Formular auf und verschicken die dort vorhandenen input-Felder.
Die nächste Idee ist ebenso naheliegend: Die Zeit zwischen Laden und Verschicken des Formulars messen, in der Annahme, dass ein normaler User ein Formular nicht innerhalb von 5 Sekunden nach dem Aufrufen verschickt (er muss ja noch den Kommentar tippen).
Dazu wird in der Session der Zeitpunkt des Ladens gespeichert und vor den Speichern des Kommentars überprüft, wie viel Zeit in der Zwischenzeit verstrichen ist. Ich habe das Ganze noch optimiert, indem ich den “Abschicken”-Button mit einem 10 Sekunden JavaScript Timer versehen habe, bevor er benutzt werden kann. Dadurch konnte ich eine Zeit von mindestens 10 Sekunden zwischen Aufruf und Verschicken des Formulars annehmen.
Diese Aktion hat fast sämtlichen Spam herausgefilert. Allerdings kam noch etwa jede Stunde ein Spam-Kommentar.
Um auch diesen zu entfernen gab es nur noch eine Möglichkeit: Ein Inhaltefilter. Wenn man sich die Spam-Kommentare anschaut, bemerkt man schnell, was der Spammer will: Einen Link zu seiner Seite unterbringen. Ein Filter, der Kommentare verbietet, die die Zeichenkette “http://” enthalten entfernt zuverlässig den Rest. Seit dieser Änderung ist kein Spam-Kommentar mehr bei mir angekommen.
Nun könnte man sich die Frage stellen, ob die ganzen anderen Aktionen dadurch überflüssig sind. Ja, das sind sie. Ich konnte alles außer den Inhaltefilter entfernen und hatte ruhe vor den Spammern.
Damit die User etwas mehr Komfort haben, habe ich vor dem Abschicken des Formulars noch eine Prüfung mit JavaScript eingebaut, damit er frühzeitig darüber informiert wird, dass er “http://” nicht verwenden darf.