Lästiger Kommentarspam

Der Preis des Erfolges: Das Blog bekommt Spam in den Kommentaren. Es sind einige tausend pro Tag, betreffen aber nur einen Artikel. Was tun?

Die triviale Lösung wäre, ein Captcha oder ähnliche Belastungen für den geneigten Leser einzubinden. Ich mag den, der seine Aufmerksamkeit meinen Texten opfert, aber nicht noch zusätzlich belästigen. Es muß auch "einfach" so gehen.

Backend Logik

ezPublish läuft hier auf PostgreSQL, ich habe also die Chance einiges im Backend abzufangen. Und die einfach Lösung ist, die INSERTs zu verhindern:

CREATE or REPLACE RULE lutz_temp_prevent_spam AS
 ON INSERT TO ezcomment
 WHERE NEW.contentobject_id IN (107, 142)
 DO INSTEAD NOTHING; 

Jedesmal, wenn ein neuer Artikel bespammt wird, muß die List manuell erweitert werden. Nachdem man die Spam-Kommentare mit einem beherzten DELETE FROM losgeworden ist.

Selbstverständlich skaliert das nicht, aber es hilft in der akuten Notlage.

Den Nutzer am Browser erkennen

Was macht also den entscheidenden Unterschied zwischen einem Robot und einem Nutzer aus?

Für die Frage hatte ich glücklicherweise Zeit. Bis heute. Denn heute begann der Spam von hunderten von IPs auf alle Beiträge breit verteilt einzuschlagen. Jetzt mußte eine neue Lösung her.

Die Idee ist simpel: Ein Angreifer schickt automatisiert ausgefüllte Formulare an das Blog. Dieses hat keine Vorkehrungen gegen XSRF, und trägt all diese Kommentare brav ein. Die gängige Abwehr ist, ein hidden Feld mit einer eindeutigen ID auszuliefern und diese nur innerhalb der von einem Cookie vermittelten Session wieder zu akzeptieren.

Selbstverständlich kennen die Spammer diese Abwehr und lesen vor jedem neuen Spam-Kommentar die Webseite erneut ein. Dann parsen sie die Felder und schicken den Request los.

Wenn ich also Erfolg haben will, muß meine Abwehr von einem Bot nicht, wohl aber von einem Nutzer mit einem normalen Webbrowser erkannt werden. Das hidden Feld darf also nicht im Formular stehen, sondern muß vom Browser eingefügt werden. Dann kann der Nutzer einfach kommentieren, ohne große Rätsel lösen zu müssen.

Das Feld wird also mit Javascript eingefügt (sorry), und das geht so. In add_comment.tpl kommt hinter die schon existierenden hidden Felder noch dieser Code rein:

{if $fields|contains( 'jsrunning' )}
  <script type="text/javascript">
    document.write("<input name='jsrun");
    document.write("ning' type='hidden");
    document.write("' value='true' />");
  </script>
{/if}

Der Code ist absichtlich so geschrieben, daß naive Parser das Input Feld nicht erkennen können. Vermutlich schlägt nun der ein oder andere Virenscanner an. Was soll's.

Und nun noch das Feld in ezcomments.ini.append.php aktivieren:

AvailableFields[]=jsrunning

[jsrunning]
Required=true
PostVarName=jsrunning 

Fertig. Die Spammer tropfen ab. Nun kann die RULE gelöscht werden und die Seele hat Ruhe.

Wie lang soll das halten?

Natürlich konnen und werden die Spammer sich darauf einstellen. Aber nur, wenn es sich lohnt. Und das ist unwahrscheinlich.

Zum einen bin ich zu unbekannt, daß sich ein Spammer am Ehrgeiz gepackt fühlen könnte und zum anderen ist die Lösung nicht Mainstream.

Avatar
allo 24/07/2013 7:14 pm
Ich verwende auf meheren Seiten ein statisches Captcha. Eine Frage, die mit Google leicht zu beantworten ist, die Frage verlinkt auf die Google-Suche. Die Antwort ist immer die gleiche.

Das funktioniert, weil nicht viele Leute es so machen.
Wäre der Ansatz verbreitet, würden die Spammer natürlich jede Frage einmal lesen und beantworten, und dann hundertfach spammen. Aber je mehr unterschiedliche Ansätze benutzt werden, desto schwerer wird es die alle automatisiert zu umgehen.
Avatar
Tim 03/12/2012 6:42 pm
Auf http://textcaptcha.com/really gibt es auch einige sinnvolle Methoden wie man Spam ohne Captchas vermeiden kann.

Eigene Methoden sind idR am effizientesten weil das für die Spammer nicht skaliert und man deshalb in Ruhe gelassen wird.
Avatar
Lutz Donnerhacke 05/11/2012 4:02 pm
Aktueller Zwischenstand: Es gibt einige tausend GET/POST Versuche, weiterhin Kommentarspam abzusetzen, von denen keiner durch kam.

Es gab einen erfolgreichen Spam-Eintrag, der laut Log offenbar manuell vorgenommen wurde. Anschließend lief der Robot los und hat seit dem auch nicht mehr aufgehört.

Den einen Spam habe ich gelöscht, der Robotspam ist abgetropft.

Total 3 comments

Post a comment

Related content