Artikel vom 18. Dezember 2008

Spamfrei Bloggen unter WordPress: Wenige Handgriffe genügen

WordPress

Spam nervt! Nicht nur in Form einer E-Mail im heimischen Posteingang, auch beim täglichen Bloggen: Gutbesuchte Blogs mit zahlreichen Backlinks werden minütlich mit automatisiert generierter Werbung bombardiert. Antispam-Plugins wie Akismet sind eine mehr oder weniger zuverlässige Unterstützung beim Ausfiltern der Schädlinge unter WordPress. Doch die beim Durchstöbern der markierten Beiträge verlorene Zeit ist zu schade und kann meist besser investiert werden.

WordPress Blogs sind leichte Beute
An sich haben die Spammer es einfach: Websites auf WordPress Basis sind anhand der Ordnerstruktur leicht zu identifizieren und zweitens hat die Datei, welche Kommentare in die Datenbank schreibt, einen fest vergebenen Namen bzw. Pfad. Penetrante Roboter werden also so justiert, dass sie nichts anderes brauchen, als diese Datei mit Daten zu beschießen. Und so wird der Blogger indirekt gezwungen, Schutzmechanismen wie Captcha einbinden (und somit dem Kommentator einen Grund mehr geben, nicht zu kommentieren) oder auf Akismet setzen und aussortierte Kommentare täglich kontrollieren.

Nachfolgend wird eine effektive Lösung vorgestellt, die manuell durchzuführen ist. Das Prinzip dahinter: Es wird eine neue Datei für die Speicherung der Kommentare angelegt. Die alte wird stillgelegt und kann von Spammern nicht mehr missbraucht werden. Um sich auf diese Art schützen zu lassen, sind lediglich 3 Schritte notwendig.

1. Action-Datei duplizieren
wp-comments-post.php aus dem Blogverzeichnis in den Ordner des verwendeten Theme kopieren (sie verbleibt auch nach einem WordPress Upgrade hier). Nach dem Kopiervorgang die Datei im Zielordner nach Wünschen umbenennen. Exemplarisch wurde das File in comments-post.php umbenannt. Dieser Schritt sorgt gleich für zwei bedeutende Vorkehrungen: Der Pfad und die Namenbezeichnung des Kommentarauslösers sind anders und den Bots völlig unbekannt, da abweichend vom Standard.

Für eine fehlerfreie Ausführung der kopierten Datei ist eine wichtige, jedoch winzige Richtigstellung notwendig. In der Zeile 16 gehört der Pfad zu wp-load.php abgestimmt: In unserem Beispiel lautet der Pfadverweis ../../../wp-load.php.

Alter Funktionsaufruf

require( dirname(__FILE__) . '/wp-load.php' );

Neuer Funktionsaufruf

require('../../../wp-load.php' );

2. Pfad im Template anpassen
Die für das Speichern des Kommentars zuständige Datei ist nun eine andere, also muss im Template comments.php auch der Action-Pfad angepasst werden. Dazu wird das besagte Template im Text-Editor geöffnet und das ACTION-Attribut im einzig dort vorhandenen FORM-Tag (im Default-Theme des WordPress 2.7 ist es Zeile 63) um den neuen Pfad der comments-post.php modifiziert. Somit wird dem Formular signalisiert, welche Datei nun nach dem Absenden des Kommentars für die Speicherung der Daten zuständig ist.

Alter Pfad des Action-Aufrufs

<form action="<?php echo get_option('siteurl'); ?>/wp-comments-post ...

Neuer Pfad des Action-Aufrufs

<form action="<?php bloginfo('template_url'); ?>/comments-post ...

3. Stilllegung des Originals
Bereits seit Generationen ist die Datei wp-comments-post.php im Hauptverzeichnis des Blogs für die Speicherung der Kommentarbeiträge unter WordPress verantwortlich. Und das wissen die Roboter. Diese Datei wird nicht mehr länger verwendet, da sie woanders hinkopiert wurde. Also wird sie mittels 4 Zeilen Code in .htaccess von außen unerreichbar gemacht und kann keine Anfragen mehr entgegen nehmen. Eigentlich würde auch das Löschen der Datei ausreichen, allerdings würde sie beim nächsten, automatischen WordPress Update wieder vorhanden sein und eine Lücke darstellen.

Sperrung in .htaccess

<FilesMatch "wp-comments-post.php">
Order allow,deny
deny from all
</FilesMatch>

Nicht einfach, aber auch nicht kompliziert
Auch wenn die Lösung auf den ersten Blick sehr komplex ausschaut, ist sie es überhaupt nicht. An sich müssen nach dem Kopieren an zwei Stellen die Pfade richtig gesetzt werden. Falls jemand keinen Zugriff auf die – nicht selten ausgeblendete – .htaccess hat, kann die wp-comments-post.php im Root-Verzeichnis schlicht und einfach umbenennen. Beim Upgrade des Blogsystem aber dran denken…

Wie sicher ist sicher?
Sicher kann es passieren, dass mit der Zeit der umgestellte Pfad entdeckt und dem Spam-Robot manuell hinzugefügt wird. Mit der Zeit, vielleicht…

Nachgefragt
Falls ihr in euren Blogs ebenfalls den gleichen Lösungsweg geht, würde ich mich über Berichte zum Spam-Aufkommen freuen.

Update vom 3. Januar 2009
Ab sofort steht eine effektivere Lösung in Form eines WordPress-Plugin zur Verfügung. Dabei sind keine manuellen Schritte erforderlich.
» Antispam Bee: Das WordPress-Plugin für den Schutz gegen Spam

Sergej Müller

[Der Autor] Sergej Müller ist enthusiastischer Software Engineer mit Schwerpunkten Webentwicklung und WordPress. Seit 2007 programmiert und vertreibt er wpSEO, das weltberühmte und patentierte SEO-Plugin für WordPress-Blogs.

Social Werkzeuge

32 Kommentare zum Artikel

590 Tage zuvor | #1 Micha

Wow, das ist gut. Danke Sergej !
Sag mal, kann den Beitrag nicht der Alex für den englischen Leserkreis bei uns reinstellen?

Micha
590 Tage zuvor | #2 Sergej Müller

Micha, ich beobachte noch diesen Ansatz und will ein wenig abwarten, um definitive Bestätigung zu haben. Dann könne wir schauen, ok?

Sergej
590 Tage zuvor | #3 Micha

Ja klar, kein Problem. Sag einfach Alex Bescheid, der kümmert sich dann.
Danke.

Micha
589 Tage zuvor | #4 flöschen

Tolle Idee, aber für weniger begabte Zeitgenossen oder Leute, die nicht gerne in ihrer Installation rumfummeln finde ich YAWASP ein ganz interessanter Ansatz. Die Formularfelder einfach mit zufälligen Namen ausstatten und den Bots noch einen Köder hinwerfen. Funktioniert bei mir erstaunlich gut und die false positives sind gleich Null, weil ja niemand versteckte Formularfelder ausfüllt. ;-)

flöschen
589 Tage zuvor | #5 Sergej Müller

YAWASP hat den Nachteil, dass man ein Plugin installiert und dann doch noch ans Template ran muss, um Anpassungen vorzunehmen. Aber klar, ist auch eine Lösung.

Nebenbei teste ich auch einen Ansatz, der mit Formularfeldern spielt. Werde ich berichten…

Sergej
588 Tage zuvor | #6 steffino

seltsamerweise bekomme ich trotz der änderungen (und neuem weblog) spams, welche aber durch akismet abgefangen werden

steffino
588 Tage zuvor | #7 Sergej Müller

Echt? Wenn es neuer Blog ist, woher haben die Spammer die Links?

Sergej
588 Tage zuvor | #8 steffino

die alte domain (www.gedankenhabitat.de) leitet auf die neue um. hatte dort aber keinerlei spam… und merkwürdigerweise gibt es da noch fremde domains wie video.klickmovie.de und tp-hostig.de die auf futur2 umleiten

steffino
588 Tage zuvor | #9 Sergej Müller

Also ich beobachte die Entwicklung seit Wochen und ich konnte den Spam auf ein Minimum reduzieren. Also 100% rein ist die Lösung nicht, aber um stolze 95 Prozent ist es weniger geworden. Die restlichen 5% sind so naiv aufgebaut, dass diese selbst WordPress ohne AntiSpam-Plugins als solche erkennt.

Sergej
588 Tage zuvor | #10 steffino

werde es mal weiter beobachten, viel ist es ja nicht (bislang erst 8 spams)

steffino
587 Tage zuvor | #11 NewsShit!

Der Ansatz ist super, doch hat er einen kleinen Schönheitsfehler:

Man braucht nur mal auf eine Artikel-Seite gehen, wo auch ein Kommentar-Formular ist. Im Quelltext findet man in KLARTEXT den absoluten Pfad, wohin die Daten gejagt werden müssen, um zu spammen.

Das Ganze sollte allerdings kaum schlimm sein: Keiner wird einen Bot umprogrammieren, nur damit er in ein paar wenigen Blogs auch noch die richtige Datei sucht.

Wenn es nach mir ginge, sollte WordPress eine Captcha-Funktion fest einbauen (natürlich abschaltbar), die den Kommentar nur beim Ergebnis “Captcha wurde richtig eingegeben” ins System überträgt. Dann hätten selbst Deeplink-Spambots keine Chance mehr.

NewsShit!
587 Tage zuvor | #12 Sergej Müller

Das ist richtig. Dass der Pfad rausgefunden werden kann, hab ich ja im Artikel hingewiesen. Das geschieht aber wirklich manuell.

Captcha ist so eine Sache, mit der nicht wirklich jeder Blogger klarkommt – ist ein Stolperstein, welcher einen Kommentator von seinem Beitrag abhalten könnte.

Sergej
587 Tage zuvor | #13 steffino

ich muss zugeben, dass ich nun erst mal yawasp teste – bislang funktioniert das ganz gut (sogar die dafür notwendigen anpassungen im template können inzwischen automatisch vorgenommen werden)

steffino
587 Tage zuvor | #14 Sergej Müller

Mit “funktioniert das ganz gut” meinst du, es kommt überhaupt kein Spam durch?

Sergej
587 Tage zuvor | #15 steffino

bis jetzt jedenfalls ist das so – aber mein spamaufkommen ist zu gering, als dass dies wirklich aussagekräftig sein könnte

steffino
587 Tage zuvor | #16 Sergej Müller

Also ich teste ja nebenbei auch mit unterschiedlichsten Methoden. Sehr interessante Werte, werde ich bald berichten.

Sergej
587 Tage zuvor | #17 steffino

bin gespannt…

gegen tb-spam hab ich übrigens (vorsorglich) gleich noch simple-tb-validation installiert

steffino
587 Tage zuvor | #18 ebh

Die Idee ist gut, ich habe sie heute nachmittag eingebaut, nachdem mich ein Bot erwischt hatte, der ist jetzt schon mal “mundtot”, ich werde weiter berichten.

ebh
586 Tage zuvor | #19 NoFear13

Du hast leider noch eine Kleinigkeit vergessen man sollte den comments-Pfad natürlich auch in der comments-popup.php anpassen.

NoFear13
586 Tage zuvor | #20 Sergej Müller

Da hast du natürlich Recht, werde ich im Artikel anpassen. Zugegeben, habe ich das Template in keinem der verwendeten Themes.

Sergej
586 Tage zuvor | #21 NoFear13

So ich habe das ganze bei mir mal getestet und bin positiv überascht hatte ein tägliches Spam-Aufkommen von 100-200 Stück und habe heute keinen einzigen Spam-Kommentar erhalten hätte nicht gedacht das die Spambots doch so simple aufgebaut sind, hätte mir doch erhofft das die wenigstens im Blog-Quelltext nachsehen wo der Kommentar hingeschickt wird.

Trotzdem vielen Dank für die echt coole Idee darauf muss man erstmal kommen, gut man sollte jetzt halt nur bei jedem Update daran denken das man bei Änderungen an der wp-comments-post.php diese auch wieder in sein Theme kopiert und dort den Pfad wieder richtig anpasst.

NoFear13
586 Tage zuvor | #22 Sergej Müller

@NoFear13

Freut mich. Es gibt einen einfachen Weg, von Updates unabhängig zu bleiben: In die neu erstellte comments-post.php folgenden Code eingeben (der Rest kann weg):

<?php require_once('../../../wp-comments-post.php'); exit; ?>

Diese Zeile holt automatisch den Inhalt der wp-comments-post.php, sie kann sich also so oft aktualisieren, wei WordPress lustig ist.

Diese Vorgehensweise werde ich heute Abend dem Artikel hinzufügen.

Sergej
586 Tage zuvor | #23 NoFear13

Danke so hab ich mir das ganze vorgestellt. Leider hat es doch die erste Spam geschafft in mein System einzudringen die alt bekannte Via***-Spam hat zwar mein Wortfilter gut rausgefiltert aber frag mich wie diese Nice Site you have-Dinger immer wieder so schnell durch das neue System kommen oder ob die manuell erstellt werden.

NoFear13
586 Tage zuvor | #24 Sergej Müller

Tja, da bin ich dabei das rauszufinden. 5% des ursprünglichen Spamaufkommens kommt auch bei mir durch. Wenn ich mir das AccessLog anschaue, dann ist es in der Tat so, dass der Spam-Request von einem richtigen Browser abgesendet wurde. Im Klartext bedeutet es also, dass der Bot über eine Browser-Engine verfügt, die ihm die Seite so darstellt, wie das menschliche Auge diese auch dargestellt bekommt. Heißt:
1. Der Bot kriegt den modifizierten Action-Pfad mit.
2. Versteckte Felder werden nicht ausgefüllt (eine der verbreiteten Prüfungen, ob ein blinder Bot am Werke war).

Ich forsche weiter ;)

Sergej
582 Tage zuvor | #25 Sergej Müller

Entweder habe ich eine zuverlässige Lösung gefunden oder die Spammer haben frei ;)

Sergej
577 Tage zuvor | #26 Sergej Müller

Guten Morgen liebe Kommentatoren.

Seit Wochen teste ich eine Lösung gegen Spam, die sehr simpel jedoch effektiv ist. Vorgestern habe ich sie in eigenständiges Plugin verpackt, welches nur aus wenigen Zeilen Code besteht. Es sind keine Anpassungen am Theme oder an der Dateistruktur notwendig – einfach das Plugin aktivieren, fertig.

Persönlich bin ich mit der Umsetzung sehr zufrieden, der Spam in meinen 3 aktiven Blogs gleicht Null – also überhaupt keine Spambeiträge mehr. Jetzt meine Frage an die Runde: Möchte jemand das Plugin testen und in seinem Blog (wo definitiv automatischer Spam reinkommt) einsetzen? 4 und mehr Augen sehen bekanntlich mehr als zwei ;)

Wenn jemand sich bereit erklärt, der möge mir doch bitte eine kurze E-Mail schreiben, ich lasse dir dann das Plugin zukommen. Nur zur Info: Bei dem Plugin handelt es sich um ein fertiges Produkt, welches ich bereits einsetze. Es geht mir nur darum zu bestätigen, dass wirklich kein Spam mehr durchkommt.

Sergej
577 Tage zuvor | #27 steffino

interesse hätte ich natürlich schon, aber in meinem weblog kommt wohl zu wenig spam (bzw. mit yawasp z.Zt. gar keiner) – hätte jedoch noch ein anderes weblog, wo mehr kommt

steffino
574 Tage zuvor | #28 Sergej Müller

Herzlichen Dank an alle Testblogger für die geleistete Unterstützung beim Testen des neuen Antispam-Plugin. Das Plugin Antispam Bee wurde soeben der Öffentlichkeit vorgestellt.

Sergej
471 Tage zuvor | #29 Peter Claus Lamprecht

Hallo Sergej,
die Block-Methode mit .htaccess und einer Ersatz-Datei, die ‘wp-comments-post.php’ included, nutze ich seit Anfang 2008. Seitdem ist absolute SPAM-Ruhe. Eigentlich wollte ich das Verfahren auf dem WordCamp in Hamburg vorstellen, aber leider fanden sich damals kaum Interessenten, und die Session fand nicht statt…

Zusätzlich zu dieser Block-Methode ‘verschlüssele’ ich die Action-URL mit HTML-Entities (z.B. h). Außerdem wende ich dieses Verfahren für den Trackback-Link an. (Beispielseite: http://www.fastagent.de/jubilaeum-20-jahre-selbststaendig.html )

Vorteil des Blockens ggü. Filtern: der durch SPAM erzeugte Traffic kommt gar nicht erst bei WordPress an.

Sonnige Grüße, PC’L

Peter Claus Lamprecht
471 Tage zuvor | #30 Sergej Müller

Hi Peter Claus.

Freut mich sehr, dass du dich hier zu Wort meldest. Ja, diese Methode ist bei größeren Projekten nach wenigen Wochen “gehackt” und die Roboter kriegen die neue URL mit.

Eigentlich braucht man die Trackback-URL im Artikel gar nicht kodieren, da die Struktur dieser Adresse bekannt und schnell zusammengestellt ist. Schau mal, hier im Blog gebe ich die Trackback-URL nirgends bekannt, Spam via Pings kommt dennoch an, wird aber von Antispam Bee zuverlässig erkannt und geblockt.

Sergej
471 Tage zuvor | #31 Peter Claus Lamprecht

Hi Sergej,
ja, die URL für Kommentare lässt sich einfach ermitteln: man muss nur einen Kommentar mit leerem Text-Feld senden – und schon steht der Pfad in der Adressleiste des Browsers.
Bei meinen Blogs waren die Bots bisher noch nicht lernfähig – es gibt nur einen, der regelmäßig über das Kontaktformular und über Formularfelder versucht, Links zu setzen. Jedoch setzt er diese Links in eckige Klammern, was sich leicht filtern lässt.

Sag mal, man könnte doch die WP-Nonce-Funktion auch für Kommentare nutzen, oder?

Beste Grüße, PC’L

Peter Claus Lamprecht
471 Tage zuvor | #32 Sergej Müller

Ja, man könnte die Nonce-Funktion aus WordPress nutzen, doch diese würde nichts bringen, da die meisten Bots Browser-Engines nutzen und somit beim Seitenaufruf alle Kriterien erfüllen, damit Nonces gesetzt und als korrekt eingestuft werden – als wären sie richtige Kommentatoren.

Sergej

2 Verlinkungen auf den Artikel

› Antispam Idee für WordPress - dynamicinternet

› MamboBlog » Spam, Spam und nochmals Spam

Kommentar verfassen