Unsichtbarer Spamschutz

So verspielt und optisch verführerisch die Captcha-Lösung auch sein mag, sie hat nicht zu unterschätzende Nachteile. Zum einen, ist sie leider (noch?) nicht Barrierefrei und ein Blinder wird hier praktisch, wie ein Spammer behandelt. Zum anderen erfordert das aufmerksame Studium des Codes, sowie dessen korrekter Eingabe in das Fomular, unangenehme Mehrarbeit für den Kommentierenden und kostet uns darum auch den ein, oder anderen interessanten Eintrag. Nicht selten wird zudem noch manche Codebestandteile verwechselt und der Kommentar anschließend beim Abschicken ohne Ankündigung vernichtet und ins Blognirvana gejagt. Sehr, sehr ärgerlich.
Nach einem langen Hickhack über Sinn und Unsinn der Captcha-Lösung, habe ich nach einer anderen, einfacheren, wenn möglich auch diskreteren Lösung gesucht, die vielleicht sogar still im Hintergrund werkelt. Eine Liste mit IP-Adressen, sei sie manuell, oder automatisch erstellt, kam für mich nicht in Frage, weil sie systembedingt immerzu wächst und irgendwann so fett sein dürfte, dass sie kaum noch durch die Türe passt und das ganze Weblog mit seiner trägen Masse verlangsamt. Ich habe den Verdacht, dass Effizienz irgendwie anders aussieht.
So rannte mir eines Tages, die Idee mit dem versteckten Feld über den Weg. Der Grund für diesen Artikel hier ist einfach. Ich habe die Anleitung für diesen Ansatz nicht verstanden und habe mir folglich frustrierende Fehlermeldungen eingehandelt. Wer also fit in PHP ist, der sollte sich vielleicht lieber den original Artikel von Stefan zu Gemüte führen. Der ist klar, prägnant und knapp formuliert. Damit ihn aber nicht jeder mit den gleichen Fragen belagert, die ich ihm schon gestellt habe, schreibe ich hier für die Fraktion, die zwar gerne bloggt, aber nur bedingt die Technik dahinter versteht.
Warum die Methode mit dem verborgenen Feld überhaupt funktioniert, weiß ich jetzt auch nicht so genau, sie ist aber effizient, arbeitet komplett im Hintergrund und erfordert keine zusätzliche Arbeit vom Kommentatoren. Also gut, reißen wir die Captcha-Barriere wieder herunter und schreiten zur Operation KEKS (Keinen Einzigen Kommentar Spam)
Dazu suchen wir uns die Datei wp-comments-post.php, die im Idealfall im gleichen Verzeichnis zu finden ist, wie die index.php, der Mutter unseres Weblogs. Diese Datei öffnen wir mit einem einfachen Textprogramm, (Neudeutsch: Texteditor)
So, jetzt gleitet unser geschultes Auge im Quelltext ein paar Zeilen hinab zu der Zeile, in der folgendes steht:
require( dirname(__FILE__) . ‘/wp-config.php’ );
Mit einer ziemlichen Wahrscheinlichkeit wird das bereits die Zeile 2 sein. Jetzt gehen wir eine Zeile tiefer (sollte leer sein) und vergrößern den Abstand zum nächsten Absatz. In diese Lücke tragen wir jetzt die folgenden Zeilen ein:
if($_POST['spamprotect'] != ’spamsucks’)
{
$file = ’spam/spamcnt.php’ ;
$fh = fopen ($file, “r+”);
$cnt = fgets($fh, 1024);
$cnt++;
rewind($fh);
fputs($fh,$cnt);
fclose ($fh);
exit;
}
Hinweis: Die Wörter spamprotect (Feld) und spamsucks (Wert) können frei erfunden werden. Dennoch sollte man sie sich merken, denn wir brauchen sie gleich noch.
Zunächst aber speichern wir die Datei ab und aktualisieren sie auf dem Server.
Und wo wir gerade dabei sind, erstellen wir im gleichen Verzeichnis noch einen Ordner mit dem Namen “spam” in den wir eine leere Textdatei hinein legen, die wir einfach nur spamcnt.php nennen. Diese Datei ist sozusagen das Zählwerk, das später die fehlgeschlagenen Spamversuche zählen wird und darum ist sie auch noch leer. Wichtig: CHMOD-Rechte vergeben. (Was ist das schon wieder?) Der Ordner benötigt die 777 und die spamcnt.php die 666.
Na bitte. Teil 1 von 3 haben wir schon geschafft.
Jetzt suchen wir die Datei wp-comments.php und dort nach dem Ausdruck
</form>
Eine Zeile darüber machen wir uns Platz für eine Leerzeile, in die wir folgenedes eintragen wollen:
<input type=”hidden” name=”spamprotect” value=”spamsucks”/>
Abspeichern und auf dem Server aktualisieren.
Das ging aber flott: Teil 2 von 3 erledigt.
Letzter Teil:
Jetzt bleibt nur noch der Ort, an dem wir die fehlgeschlagenen Spamversuche sichtbar machen wollen. Dafür bietet sich die Startseite hervorragend an. Sie heißt index.php. Hier müssen wir zunächst die Funktion spamcounter definieren, die wir dann später aufrufen wollen. Der beste Ort dafür wäre kurz nach den Meta-Tags. Da schreiben wir folgendes dahinter:
<?php
function spamcounter()
{
$file = ’spam/spamcnt.php’ ;
$fh = fopen ($file, “r+”);
$cnt = fgets($fh, 1024);
fclose($fh);
return $cnt;
}
?>
So, einen Schritt noch, dann ist es geschafft.
An der Stelle, an der jetzt die Zahl erscheinen soll, schreiben wir:
<? php echo spamcounter(); ?>
Ein Beispiel?
Einfach mal diese Seite bis ganz nach unten scrollen.
Anmerkung:
Solange niemand einen Spamkommentar abgibt kann auch nichts geblockt werden. Folglich wird auch keine Zahl zu sehen sein. Ich habe mir dadurch geholfen, dass ich einfach die Zahl Null (0) in die Zählwerk-Datei (spamcnt.php) geschrieben habe, bevor ich sie abgesichert habe. So wusste ich immerhin schon mal, dass das Skript etwas herausgibt.
Vielleicht liest ja auch ein netter Mensch hier mit, der mir sagen kann, wie man dieses Bollwerk überhaupt testen kann…
[Update]
Ja, gibt es. (sowohl den netten Menschen, als auch eine Möglichkeit zu testen.)
Sie hier zu beschreiben, wäre aber sicher etwas bekloppt…
[Breaking News]
So schnell hätte ich es nicht erwartet: Der Spamschutz hat nur knapp eine Woche gehalten und ist soeben geknackt worden. Viele Kollegen aus der Mailingliste kauern jetzt im Flur ihrer Weblogs herum und heulen, was das Zeug hält. Viele schlossen vorrübergehend ihre Kommentarfunktionen. So bleibt jetzt entweder der Gang zrück zu der spanischen Captchalösung, oder zu einem nagelneuen Plugin das Hashcash heißt.
Ein Kommentar von: Mario | 22. Dezember 2004 | 12:23 Uhr
Fast
Die Funktion zum Spam zählen sollte besser in die my-hacks.php geschrieben werden.
Und warum es funktioniert: Die Spammer gehen von einer WP-Standard-Installation aus und rufen eigentlich nur die wp-comments-post.php auf und übergeben ihr die entsprecenden Parameter, die normalerweise vom wp-comment.php übertragen werden. Hast Du nun das hidden-Feld drin, haben das die Spammer natürlich nicht, müssten also erstmal die wp-comments.php auslesen und auswerten (Was auch passieren wird, sobald dieser Schutz die kritische Masse überschreiten wird. Weswegen ich sie auf meinem Blog auch nicht näher erläutert habe!).
Ein Kommentar von: SteBu | 22. Dezember 2004 | 12:33 Uhr
So es klappt auch(siehe Mail) ich habe mal einen Spam simuliert.
Ein Kommentar von: Mathias | 22. Dezember 2004 | 19:59 Uhr
@ Mario: Vielen Dank für Deine Erklärung, wie das alles so funktioniert. Die my-hacks.php Sache habe ich sofort ausprobiert und dabei festgestellt, dass der Schutz zwar genauso funktioniert, sich aber der Seitenaufbau dramatisch verlangsamt hat. So bin ich wieder zum Eintrag in die index.php zurückgekehrt.
@Stefan: Danke für Deinen Tipp in der Mail - hat sofort funktioniert…
Ein Kommentar von: tommy | 27. Dezember 2004 | 09:24 Uhr
Joa der Tipp ist nicht schlecht. Wie sieht es aber mit Spambots aus, die nicht nur einfach das Kommentar-Skript aufrufen, sondern die Seiten parsen, nach dem Kommentar-Formular suchen, dieses ausfüllen und abschicken? Somit würde das versteckte Formularfeld auch abgeschickt und die hier beschriebene Lösung hinfällig. Für den momentanen Stand der Dinge wird sie sicher genügen und ich find das wirklich eine gute Idee, simpel und funktionell. Aber die Techniken der Spammer werden sich verfeinern und “verbessern”. Naja mal sehen was die nächste Wordpress-Version bringt.
Ein Kommentar von: Mathias | 28. Dezember 2004 | 06:25 Uhr
Hallo Tommy.
Ich habe auf einem neuerlichen Anti-Kommentarspam-Streifzug, mir die englischen Seiten einmal genauer vorgenommen. Zwei Ergebnisse:
1. Es gibt bereits ein äußerst einfach zu installierendes WordPress Plugin, dass genau das ausführt, was ich im Artikel in epischer Breite beschrieben habe.
2. Es gibt inzwischen den noch effektiveren Nachfolger dieses Plugins, der genau an den Bedenken ansetzt, die Du in Deinem Kommentar beschreibst.
Ein Kommentar von: tommy | 28. Dezember 2004 | 10:47 Uhr
Hi Mathias,
). In Silke Schürmanns Weblog gibt es einen interessanten Artikel, der beschreibt wie man barrierefreie Captchas einsetzt. So kann man den Kommentator einfache mathematische Aufgaben oder Wortfeldzuordnungen lösen lassen - letzteres ist sehr schön im Frankfurter Laubfrosch zu testen. Inwiefern diese zusätzlichen Formulareingaben jedoch Weblogleser vom kommentieren abhalten kann ich nicht recht beurteilen. Da sind die versteckten Funktionen wohl die bessere Wahl. Wie denkst du darüber?
vielen Dank für deine Recherche! Besonders das Plugin unter 2.) werde ich mir mal genauer anschauen. Ich habe den Artikel und auch den Quelltext der Seite mal kurz überflogen und festgestellt, dass das Plugin mit JavaScript arbeitet. Die im Hintergrund werkelnden Funktionen gefallen mir eigentlich ganz gut, jedoch ziehe ich es vor auf JavaScript möglichst zu verzichten (wahrscheinlich ist durch meine Arbeit an HTMLArea eine gewisse Antipathie entstanden
Ein Kommentar von: Mathias | 29. Dezember 2004 | 03:56 Uhr
Vorab: Sorry dafür, dass Dein Kommentar in die Moderationsschublade gelangt ist. Ich hatte die zulässige Anzahl von Links auf 2 stehen gehabt. Jetzt steht sie wieder auf 5…
Zum Rest: Ich bin ja alles andere, als ein Fachmann in diesen Dingen. Dennoch glaube ich, dass ein halbwegs vernünftiges captcha (lesbar) keinen ernsthaften Kommentar verhindert.
Im Gegenteil.
Ich bin von Hause aus ziemlich verspielt und fände eine “Quizfrage zum Artikel” ein feines und witziges Werkzeug. Also wenn man beispielsweise einen Artikel vom Fußballspielen liest, wird man beim kommentieren gefragt, wie der aktuelle Bundestrainer heißt. Diese Frage richtet man im Adminbereich dann so ähnlich ein, wie das Passwort bei geschützten Artikeln.
Zur Zeit wird einem ja überall erzählt, dass einzelne Spamroboter inzwischen die captchas entziffern können. Nur figürliche Motive, wie zum Beispiel einen Rasierapparat, am besten noch in 3D, geben auf absehbare Zeit etwas Sicherheit. Ich könnte mir also vorstellen, dass filmische Darstellungen das gleiche erreichen. Hätten wir also eine Zahlenreihe”1234″, die in einem Filmchen nacheinander erscheint, sich darin vielleicht dreht, um in alle Himellsrichtungen wieder zu verschwinden, wie wäre das?
Ich könnte mir für soetwas Flash ganz gut vorstellen, denn Flash könnte die Zahlen dynamisch laden und ließe sich zusätzlich noch dazu überreden, diese Ziffern akustisch vorzutragen. Dann wäre man sogar Barrierefrei. Aber wie gesagt - ich bin hierbei leider kein Fachmann, aber ich stell mir gerade vor, wie es wäre wenn man auf einem Flash-captcha per drag & drop vier zerknüllte Papiere in einen Papierkorb stopfen muß, bevor der Kommentar angenommen wird. Wie will das ein Script lösen?
OK. Flash ist nicht jedermanns Sache, aber effizient eingebunden, halte ich es für Wert, dass man mal darüber nachdenkt.
Was mich aber fürchterlich nervt, sind die captchas, die den Inhalt aller Felder löschen, sobald man den falschen Code eingegeben hat. Vor allem: wie schnell hat man da eigentlich etwas verwechselt.
Da würde ich nicht nochmal einen Kommentar schreiben wollen. Ganz anders als Du Tommy, der Du tapfer den Text hier ein zweites mal mühevoll eingetippt hast. Sorry nochmals…
PS. was die HTML Area angeht, oh, da kann ich Dir nur Recht geben, dieser Schrott ist einfach zum davonlaufen!
Ein Kommentar von: tommy | 29. Dezember 2004 | 17:53 Uhr
n’Abend!
Also deine Idee mit der “Quizfrage zum Artikel” find ich wirklich gut. Ich hatte in eine ganz andere Richtung gedacht, nämlich dass im (Captcha)System/Plugin mehrere vordefinierte Fragen zur Verfügung stehen, und diese dann angezeigt werden. Aber die Frage oder das Rätsel direkt mit dem Artikel zu verbinden wäre natürlich ein ausgezeichnetes “Gimmick”, das das Kommentieren nur spaßiger machen würde!
Irgendwie habe ich das gar nicht so genau getestet und erst nach deinem letzten Kommentar danach gesehen. Ich verwende den authimage-Hack, und werde wohl die möglichen Zeichen auf die Buchstaben begrenzen, so dass man beispielsweise die null und das große O nicht mehr verwechseln kann. Danke nochmal für diesen (indirekten) Hinweis! Nichtsdestotrotz sollten sich im Moment ernsthafte Kommentierer von soetwas nicht abhalten lassen!
Ich habs auch nicht ;P Also Mathias: macht gar nix dass ichs nochmal eintippen musste 
Zu den Ideen mit dem Flash-Captcha: Ich glaube nicht, dass das wirklich barrierefrei wäre. Die Sprachausgabe ist natürlich ein dicker fetter Pluspunkt, und ich glaube deine Idee wäre ein ausgezeichnetes Anwendungsgebiet für diese sooft mißbrauchte (stumpfsinnige Intros/lästige Werbung) Webtechnologie!
Ich finde auch, dass Captchas nicht die Formularfelder löschen dürfen, wenn der z.B. der Code falsch eingegeben wurde. Zu meinem Entsetzen musste ich heute feststellen, dass es in meinem Weblog momentan genau so ist.
Ein Kommentar von: Mathias | 30. Dezember 2004 | 06:43 Uhr
[ ++ Breaking News ++ ]
So schnell hätte ich es nicht erwartet: Der Spamschutz hat nur knapp eine Woche gehalten und ist soeben geknackt worden. Viele Kollegen aus der Mailingliste sitzen jetzt im Flur ihrer Weblogs und heulen, was das Zeug hält. Viele von ihnen haben mittlerweile mit zitternden Händen die Kommentarfunktion deaktiviert. So bleibt jetzt entweder der Gang zrück zu der verpönten spanischen Captchalösung, oder zu einem nagelneuen Plugin das Hashcash heißt.
Ein Kommentar von: Karin Zick | 14. Juni 2006 | 17:45 Uhr
Kann man den Spamschutz auch außerhalb eines Weblogs bzw. Wordpress zum generellen Schutz vor Spambots verwenden? Beispielsweise in einem PHP-Kontaktformular?
Karin Zick
Ein Kommentar von: Steffi | 15. September 2006 | 13:35 Uhr
Schön.
Ein Kommentar von: Chris | 5. Oktober 2006 | 14:05 Uhr
Hallo zusammen,
ich musste jetzt auch für ein Kontaktformular einen Spamschutz finden, damit der Server nicht für Massenemails oder Postfachüberflutung missbraucht wird.
Leider konnte ich kein geeignetes Tool dafür finden..
Es entspricht zwar nicht einer Blog-Seite, aber demnoch könnt ihr meinen Ansatz sicher ähnlich umsetzen.
1.) Es ist nur ein einziges @-Zeichen zugelassen “substr_count($email, ‘@’) >1″ (in ne if-abfrage packen..)
2.) Die Zeichenfolge “bcc:” ist gar nicht erlaubt “substr_count($email, ‘bcc’) >0″ (wieder in ne if-abfrage..)
3.) Wenn die Kontaktmail ansonsten einwandfrei ist, hol ich mir den Unix-timestamp und speicher diesen mit der IP in einer Datenbank (Insert wenn die IP noch nicht vorhanden ist, Update auf den timestamp falls doch).
Sollte jemand dann innerhalb von 60 Sekunden erneut versuchen eine Email abzuschicken, fang ich das anhand einer einfachen if-Abfrage ab “if(($timestamp-60)
Ein Kommentar von: Anonymous | 12. Dezember 2006 | 23:19 Uhr
huhu
Ein Kommentar von: jan dresler | 30. Juli 2008 | 02:48 Uhr
hi.