Mittlerweile geht es auch bei mir los, dass regelmäßig Bots SPAM TrackBacks hinterlassen. Dass diese SPAM online geht, kann man bei Serendipity ziemlich leicht verhindern, indem man das Spam Plugin geeignet einstellt. Bei mir werden TrackBacks auf Artikel mit einem bestimmten Alter nur noch moderiert zugelassen. Mein hartnäckigster SPAM Bot versucht es immer wieder mit dem Eintrag 1, der dann definitiv alt genug ist.
Nervig ist dabei allerdings, dass man diese Kommentare noch moderieren muss. Sie erscheinen weiterhin in der Administrationsoberfläche der Kommentare und man muss sie manuell löschen. Dabei hatte ich schon oft die Befürchtung, aus Versehen auch normale und erwünschte Trackbacks gelöscht zu haben.
Wie es viel eleganter geht, beschreibt Isotopp recht ausführlich. Er manipiliert die .htaccess Datei des Serververzeichnisses sehr clever, so dass erkannte Spammer erst gar nicht die comment.php aufrufen können, die für den Eintrag eines TrackBacks zuständing ist. Dadurch gelangen die SPAM TrackBacks gar nicht erst in die Datenbank.
Mir war bisher bekannt, dass man einzelne IP Adressen von der ganzen Site oder von einzelnen Dateien mittels der <Files> Direktive in der .htacces Datei ausschließen kann. Mit dieser Methode kann man bereits sehr erfolgreich Spammer Requests verhindern. Der Nachteil ist dabei, dass man neu gefundene IPs immer nachtragen muss, was recht mühsam werden kann. Da ist die Methode von Isotopp schon deutlich cleverer: Bots werden anhand der User Agent Angabe identifiziert. Nach Überprüfen meiner Logdateien stelle ich auch fest, dass Spammer Bots gerne die IP Adresse wechseln, aber eher selten den Namen, den sie als User Agent mitliefern.
Isotopp beschreibt bei sich einen Bot, der sich mit "TrackBack/1.02" meldet. Diesen habe ich auch in meinen Logfiles, zusätzlich noch zwei weitere, die sich als "TrackBack Checker" und einfach ohne Namen melden. Isotopps Methode nimmt nun diese Namen und benutzt sie in einer <FilesMatch> Anweisung:
<FilesMatch "comment\.php">
SetEnvIfNoCase User_Agent TrackBack spammer=yes
deny from env=spammer
</FilesMatch>
FilesMatch interpretiert im Gegensatz zu Files den Ausdruck für den Filenamen immer als regulären Ausdruck, deshalb muss man hier den Punkt escapen. Man könnte in dem Fall aber auch problemlos die Files Direktive benutzen. Die Anweisung SetEnvIfNoCase (die mir neu war) setzt eine beliebige Variable, wenn eine bestimmte Eigenschaft zutrifft. Isotopps Code bedeutet also: "Wenn der User Agent das Wort 'TrackBack' enthält, dann setze die Variable spammer auf yes. Die nächste Zeile bewirkt dann, dass der aktuelle Request abgewiesen wird, wenn vorher die Variable spammer gesetzt wurde, wobei es laut Isotopp unerheblich ist, welchen Wert diese Variable bekommen hat. Sie muss einfach nur gesetzt worden sein.
Geniale Idee! Damit kann man nun - unabhängig davon von wem oder wo sie gerade eingesetzt werden - alle SPAM Bots ausschalten, die die Software namens "TrackBack/1.02" und spätere Versionen benutzen. Auch mein "TrackBack Checker" sollte so außen vor bleiben. Meinen Dauer-SpamBot, der sich immer ohne User Agent Angabe meldet, traue ich mich noch nicht auf diese Weise auszuschalten, da werde ich wohl vorerst auf das Aussperren per IP Adresse zurück greifen.
Die Methode ist auch deshalb so charmant, weil man hier beliebige Server Variablen abtesten kann und sie bei beliebiger Blog Software funktioniert.. Bei anderer Software muss man nur den Namen der Datei austauschen, die gesperrt werden soll.
Eine weitere Beschreibung zu diesem Thema gibt es auch im Artikel "Böser Bot, guter Bot" von Jan Schmager, der dann mehr auf SetEnvIf eingegeht, bzw. die Alternative BrowserMatch. Nebenbei: Um SetEnvIf und BrowserMatch benutzen zu können, muss der Apache Server das Modul mod_setenvif geladen haben.
Nach dem Lesen beider Artikel sieht mein Teil in der .htaccess, der für die Botabwehr zuständig ist, nun also wie folgt aus:
# BEGIN ANTI SPAM
<Files comment.php>
# knappe 403 Error-Message
ErrorDocument 403 "403 Forbidden
# Bots, deren Namen mit TrackBack beginnen, markieren
BrowserMatch ^TrackBack is_trackback_spammer
# Bots, die keinen Namen angeben, markieren
BrowserMatch ^$ is_trackback_spammer
# Aussperren
Order Allow,Deny
Allow from all
deny from env=is_trackback_spammer
</Files>
# END ANTI SPAM
Dann habe ich einfach mal ein paar Tage abgewartet und danach die Logfile überprüft. Beide Bots mit User Agent Angaben ("TrackBack/1.02" und "TrackBack checker") haben inzwischen mal vorbei geschaut:
"POST /comment.php?type=trackback&entry_id=22 HTTP/1.0" 403 13 "-" "TrackBack checker"
"POST /comment.php?type=trackback&entry_id=12 HTTP/1.0" 403 13 "-" "TrackBack/1.02"
Sie haben also einen 403 erhalten, und in meiner Adminoberfläche ist tatsächlich kein Trackback um diese Uhrzeit eingetroffen. Klappt!
Jetzt kam nur noch der Bot ohne User Agent Angabe durch, den habe ich nach diesem Erfolg nun auch mal ausgesperrt. Die Regel dafür ist dann "BrowserMatch ^$ is_trackback_spammer". In einem regulärem Ausdruck bedeutet das ^ Zeilenanfang und $ Zeilenende, in diesem Fall also Anfang bzw. Ende der User Agent Angabe. Der Ausdruck ^$ identifiziert also alle User Agents, die zwischen Anfang und Ende nichts haben, sprich: Die keinen User Agent liefern. Wieder einen Tag gewartet und meine Logfiles kontrolliert:
"POST /comment.php?type=trackback&entry_id=1 HTTP/1.1" 403 25 "-" "-"
Auch der fleißigste Bot bei mir bekommt nun ein 403! Seit dem ich diese beiden BrowserMatches in meiner .htaccess enthalten habe, habe ich nicht einen einzigen SPAM TrackBack mehr erhalten! Somit kann man sich nun auch das Verbieten über IP Adressen Listen sparen. Super Erfolg! Ich bin zuerst übrigens auf das "-" reingefallen und dachte, er sendet ein "-" als User Agent. Im Logfile beschreibt das aber einfach eine leere Angabe.
Schön wäre es natürlich noch, wenn diese Technik gleich in das AntiSpam Spam Plugin von Serendipity eingebaut wäre, damit man nicht immer direkt an der .htaccess Datei editieren muss, was man wohl sicher nur den wenigsten Blogbesitzern zumuten kann. Serendipity bearbeitet diese Datei ja sowieso schon. Hmm... Mal darüber nachdenken.. 
Danke Isotopp für diese Idee! 
Als nächstes mache ich mir evtl. mal Gedanken zu den Bots, die hier zwar nicht als SPAMmer auftreten, aber trotzdem unnötig Bandbreite verursachen. Davon entdecke ich in letzter Zeit immer öfters Einträge in meinen Logfiles...
Robert Lender
Homepage
07/28/2007 09:58AM
Grischa
Homepage
07/28/2007 02:06PM
Robert Lender
Homepage
07/29/2007 03:59PM
Grischa
Homepage
07/29/2007 04:44PM
Robert Lender
Homepage
07/29/2007 05:05PM
Martina
08/04/2007 12:33AM
Martina
Homepage
08/13/2007 11:02AM
Grischa
Homepage
08/13/2007 01:29PM
Martina
Homepage
08/15/2007 11:06AM
Martina
Homepage
08/15/2007 11:07AM
Peter
Homepage
07/22/2008 04:51PM
Grischa
Homepage
07/22/2008 08:48PM
Peter
Homepage
07/22/2008 10:46PM
Grischa
Homepage
10/19/2008 10:37PM
Grischa
Homepage
07/27/2008 08:32PM
Uwe
Homepage
08/27/2008 05:46PM