Hadmut Danisch

Ansichten eines Informatikers

Neuer Spam-Schutz für’s Blog

Hadmut
16.5.2011 22:55

Nachdem ja immer wieder – teils mehr, teils weniger berechtigte – Beschwerden über den Kommentar-Spam-Schutz in meinem Blog reinkommen, mal ein paar Überlegungen, wie es anders laufen könnte.

Ganz ehrlich, Captchas mag ich nicht, und es gibt schon automatisiertes Knacken (oder Crowd-Sourcing über irgendwelche Pornoserver). Deshalb habe ich gerade ein Plugin im Blog, das es irgendwo im Internet mal gab, dessen Wirksamkeit aber inzwischen auch etwas nachläßt, nachdem die Spammer sich adaptieren, während die Beschwerden der Kommentatoren zunehmen. Da ich aber demnächst mal daran gehen will, WordPress durch etwas anderes zu ersetzen, wird das darauf hinauslaufen, daß ich mir selbst was bauen möchte.

Früher hatte ich im Blog Benutzeraccounts eingeschaltet, da mußte man sich zuerst registrieren und zumindest einen per Link verschickten URL anklicken. Führte aber auch zu Beschwerden und dazu, daß viele nicht kommentiert haben.

Was also tun?

Die Anforderung ist, möglichst jedem mit möglichst allgemeinem Browser mit möglichst wenig Aufwand das Kommentieren zu erlauben, trotzdem aber das Spammen einzudämmen. Auf die Moderation kann und will ich schon aus rechtlichen Gründen nicht verzichten, außerdem gibt es doch ab und zu mal Kommentare, die zwar kein Spam, aber nicht tageslichttauglich sind. Es geht also um die Reduktion der Moderationslast. Vor Benutzung des besagten Plugins habe ich teils mehrere hundert Spam-Kommentare pro Tag bekommen. Geht so nicht.

Ein anderer Aspekt sind die in Deutschland mittlerweile doch sehr heftigen Datenschutzanforderungen. Man muß also vorsichtig sein, ob und was man speichert.

  • Ein objektives algorithmisches Kriterium für Spam, was keine false positives und möglichst wenig false negatives liefert, und ohne externe Spam-Datenbanken auskommt, fällt mir derzeit nicht ein.
  • Was ich aber sagen kann ist, daß Spam nahezu immer von ausländischen IP-Adressen kommt, nur sehr selten von deutschen (da fallen mir vor allem die zu-Guttenberg-Lobeshymnen ein). Da ich aber dann auch ein drittes Blog auf englisch öffnen will, bringt mich diese Unterscheidung nicht so wirklich weiter.
  • Ein recht gutes Kriterium war bisher, ob ein Kommentar auf deutsch oder englisch abgegeben wurde. Die Sprache eines Textes müßte sich auch mit überschaubarem Aufwand ziemlich zuverlässig feststellen lassen. Klappt aber nicht mehr, wenn man englisch bloggt.
  • Allerdings konzentrieren sich die Spammer wohl doch auf einige Staaten. Die Spams auf mein Blog sind ganz drastisch nach unten gegangen, seit ich das ganze Netzwerk eines ukrainischen und eines chinesischen Providers vom Kommentieren ausgesperrt habe.
  • Gewisse Link-Tags sind natürlich ein Aussperrkriteriuem, etwa wenn jemand JavaScript oder iframes reinpacken will.
  • Problematisch ist, daß immer mehr Leute versuchen, ihre Webseiten (ohne direkte kommerzielle Absichten und ohne ein Produkt verkaufen zu wollen) in den Suchmaschinenrankings nach oben zu bringen, indem sie auf themenverwandte Blog-Artikel Kommentare mit Links oder Homepages auf die eigene Webseite unterbringen. Manchmal sehr schwer von einem echten Kommentar zu unterscheiden, fällt nicht mal mir immer leicht.
  • Da ich nicht überprüfen kann, was genau der Spamfilter derzeit abwehrt, weiß ich nicht so genau, was passiert und reinkommt, wenn man ohne ihn arbeitet.

Momentan geht mir deshalb folgendes durch den Kopf:

Der eingegebene Kommentar wird nach bestimmten Kriterien durchsucht, etwa ob er Links enthält, verbotene Tags, viel oder wenig Sprache usw. Dazu bekommt er einen Rating-Wert.

Anhand einer (leider manuell zu pflegenden) Datenbank, die keine einzelnen IP-Adressen, sondern nur Provider-Netze enthält, also nicht personenbezogen ist, gibt es Bonus- und Maluspunkte, also grob orts- und providerbezogen.

Irgendwie müßte man denen, die schon gute Kommentare abgegeben haben, einen Bonus zukommen lassen. Könnte man über ein Cookie, ist aber dadurch nicht stabil und browserübergreifend.

Und aus dem Vergleich zwischen Spam-Rating, Provider-Einstufung und individuellem Bonus könnte man entscheiden, ob man den Kommentar ablehnt oder zur Moderation annimmt. D

Die Tricks des bisherigen Plugins, über Cookies und Javascript erkennen zu wollen, ob Mensch oder Bot kommentiert, funktionieren nicht mehr so genau und führen zu zu vielen Problemen, die möchte ich daher nicht mehr einsetzen. Zumal sie den Nachteil haben, daß zuviel dynamisch erzeugt werden muß.

Eine Überlegung ist noch, das HTML-Formular zu randomisieren, etwa die Eingabewertenamen, um das automatische Adaptieren zu erschweren. Oder das Kommentareingabefenster nicht unterhalb des Blogartikels, sondern in einer separat aufzurufenden Seite zu positionieren, die wiederum nicht per Google zu finden sein soll und außer dem Formular nichts enthält, so daß die Webseiten gegenüber Suchmaschinen nicht wie ein interaktives Blog, sondern wie statische Webseiten erscheinen. Oder man erzeugt das Eingabeformular selbst erst beim Client in JavaScript. Das sind aber alles so Hexenküchenrezepte, die ich eigentlich nicht mag, weil der Angreifer sich daran adaptieren kann, sobald sich der Aufwand für ihn lohnt.

Einfach gar keine Kommentare mehr zu erlauben wäre auch nichts. Dafür kommen zu viele sehr gute und nützliche Kommentare rein, die sind mir den Aufwand schon wert.

Authentifikation über Google, Yahoo usw. wäre denkbar, hat aber zu viele Nachteile. In einigen Jahren könnte man vielleicht mal daran denken, Leute zu bevorzugen, die sich per ePerso anmelden, falls das für Blogs mal erlaubt wird.

Welche Probleme und Möglichkeiten IPv6 hier bringen könnte, darüber muß ich noch nachdenken und experimentieren, dazu ist es noch zu früh.

31 Kommentare (RSS-Feed)

georgi
17.5.2011 6:55
Kommentarlink

Das Linksetzen solltest aber nicht behindern. Sonst könnte man ja nicht mehr auf Quellen verweisen.

Setzt wordpress nicht das nofollow-Flag in den von Kommentatoren gesetzten Links, so daß Google & Co. die nicht berücksichtigt? Außerdem: Was geht Dich Google an? Sollen sie doch SEO machen.


Hadmut
17.5.2011 10:48
Kommentarlink

@georgi: Was mich Google angeht? Na, über Google kommen die meisten Leser auf meine Blogseiten. Ich will, daß das funktioniert.


Henning
17.5.2011 8:30
Kommentarlink

Hallo Hadmut,

in dem Blog eines Vereins, in dem ich Mitglied bin, wird die Prüfung durch ein einfaches Challange-Response realisiert. Zur Prüfung erscheint eine einfache Zufallsfrage, in der Art “Wieviel ist fünf plus zwölf”, oder “Das Produkt aus drei und sieben” und man muss die Antwort als Kontrolle eingeben. Das scheint ganz gut zu klappen und ist meiner Ansicht nach benutzerfreundlicher als Captchas, die man manchmal selbst kaum lesen kann.


Hadmut
17.5.2011 10:49
Kommentarlink

@Henning: Mmmh, das bringt mich auf eine nette Idee. Da ich mir ja ein gehobeneres Publikum und gebildete Kommentare wünsche, könnte man da gleich so richtig sauschwere Fragen stellen, so daß nur die wirklich Schlauen an die Kommentarfunktion kommen. 😉


Haskell
17.5.2011 8:52
Kommentarlink

Ich komme auf meinen Webseiten gut mit der Kombination der Plugins “Antispam Bee” und (ich weiß, du magst es nicht) “Math-Captcha” aus.


Haskell
17.5.2011 8:53
Kommentarlink

Ergänzt wird das ganze durch einen Cronjob, der regelmäßig die aktuelle Liste von stopforumspam.com in die .htaccess-Datei schreibt.


yasar
17.5.2011 9:47
Kommentarlink

Geht es darum, nur Deinen Blog zu schützen, oder die Software so allgemein zu gestalten, daß sie in größerem Maßstab einzusetzen?

Sofern es nur dein Blog sein soll, könntest Du es wie Alex von daujones.com halten und ein einfaches (selbstgestricktes) captcha setzen, daß die Leute nicht allzu arg behindert. Da dürfte sich der Aufwand für die Pornoserver und Chinesen nicht lohnen extra Ihre Software dafür anzupassen.

Sofern es natürlich ein allgemeines Modul sein soll, ist es natürlich ein Hase/Igel-Spiel mit den Spammern. Da wüßte ich auch nicht, was momentan sinnvoll ist, ohne die Leute allzuarg zu behindern.


Hadmut
17.5.2011 10:53
Kommentarlink

@Yasar: Das ist beim Spam-Schutz eine sehr schwierige Frage. Individuelle Nischenlösungen sind einfach und wirksam, weil es sich für Spammer nicht lohnt, Einzel-Lösungen zu analysieren und zu umgehen. Deshalb täuschen sie auch häufig darüber hinweg, daß sie nicht wirklich gut und dicht sind. Das muß dann nur dem Status Quo standhalten.

Baut man sie allgemein, ist das viel schwieriger, weil sie dann auch der Adaption durch Spammer standhalten muß.


Kadenus
17.5.2011 11:47
Kommentarlink

Hi Hadmut,
ein Kriterium, das gut funktioniert und sehr simpel zu implementieren ist, ist folgendes:
Überprüfe einfach wie lange ein User einen Artikel gelesen hat, bevor er einen Kommentar abgibt. Wenn du das Ganze noch mit der Artikellänge verrechnest und wie lange sein Cursor tatsächlich in der Textbox war bevor er auf “Submit” drückt erhälst du einen relativ Aussagekräfigen Parameter.
Ohne JS aber leider aber nur eingeschränkt umsetzbar…


Hadmut
17.5.2011 11:53
Kommentarlink

Da hab ich so meine Zweifel.

Erstens müßte man dazu was speichern, und das darf man so sicherlich nicht, gerade wenn man überwachen will, wie lange jemand etwas liest.

Zweitens weil Spammer es trivial umgehen können und ich wetten würde, daß sie es schon tun.

Drittens weil es nichts sagt. Mal klickt einer direkt auf einen Artikel, den er schon kennt, mal will einer kommentieren, nachdem er nur zwei Sätze gelesen hat, und mal kennt einer schon was aus dem RSS Feed.

Viertens, weil sich die Nutzer nicht eindeutig einer Webabfrage zuordnen lassen, etwa wenn sie hinter NAT oder einem Proxy sitzen.

Fünftens weil sich das arg danach anhört, als ob man da ziemlich lange herumexperimentieren müßte, bis man das zu allen Browsern kompatibel und brauchbare Parameter gefunden hat.

Zugegeben, es ist eine Idee. Aber bei der Implementierung kann man sich leicht verzetteln. Falls ich mal Zeit übrig habe…


Kadenus
17.5.2011 12:06
Kommentarlink

@Hadmut: Klar, ist kein Allheilmittel, aber immerhin ein weiteres Kriterium, dass, wenn erfüllt, wenige false positives liefert.

False negatives werden aber aus den von dir genannten Gründen einige dabei sein.


Hadmut
17.5.2011 12:10
Kommentarlink

Ich werd’s mal in Betracht ziehen, aber nicht gleich zu Anfang. Erscheint mir sehr viel Fummel- und Experimentierarbeit, bis das mal läuft.


quarc
17.5.2011 20:46
Kommentarlink

Ich halte die Methode per Password, die ich damals noch miterlebt habe,
nach wie vor für die beste. Auch deshalb, weil man dann auch nicht auf
einen Javascriptfähigen Browser angewiesen ist. Da Du ohnedies von anonymen
Kommentaren nichts hältst, sehe ich auch nicht so ganz, warum sich ein
Kommentator an dieser Methode stören sollte.

Demgegenüber ist das WordPress-Plugin am ehesten dazu geeignet, ernsthafte
Kommentatoren zu vergraulen, die ja meist noch andere Sachen zu tun haben.
Zumal die sich von der gebotenen Meldung des Plugins eher verulkt fühlen
dürften. Nachdem ich nun gemerkt habe, dass wohl in erster Line die
Zeilenzahl des Kommentars bewertet wird und dementsprechend meinen
Kommentar in mehreren Häppchen abgeschickt habe, frage ich mich: was soll
das bringen? Kommentarspam dürfte doch wohl eher kurzer Text sein.


pepe
18.5.2011 0:59
Kommentarlink

Gibt es Meinungen zu disqus.com? Das wird zunehmend verwendet, ich hab sogar schon mailinglist-archives mit disqus-comments gefunden. Es erlaubt anonymes posten und Moderation. Als zentral gehosteter Dienst kuemmern sie sich auch etwas um Spam, aber ich weiss nicht wie effektiv sie damit sind.

Eventuell kann man auch OpenID auth. verlangen aber dann zB ueber openid.anonymity.com immernoch anonym/pseudonym posten. Oder nur ueber einen eigenen blanko openID service erlauben. Das macht denke ich dann so schnell kein Spammer nach, es sei denn sie kuemmern sich speziell um dein Blog. Und wer kommentieren will muss beweisen, dass er lesen kann 🙂

Disqus ist etwas web20-lastig aber man bekommt auch feedback per mail und kann direkt auf comments antworten.


pepe
18.5.2011 1:02
Kommentarlink

(openid.anonymity.com sagt, sie wuerden Captchas verwenden um missbrauch zu verhindern, tun sie aber offenbar nicht..)


dasuxullebt
18.5.2011 16:07
Kommentarlink

Wie wäre es damit, dass du das Kommentieren nur noch über SSL erlaubst? Das unterstützen die meisten Browser (vorausgesetzt du hast einen guten Schlüssel), und es dürfte die meisten Spambots immernoch viel zu stark auslasten, als dass sie sich daran in absehbarer Zeit anpassen.

Ist übrigens etwas, worüber ich sowieso schon länger nachdenke: Spam ist ein Problem von Jedem, und in der Regel ist es kein Problem, vor dem Zugriff auf bestimmte Ihnalte dem Rechner eines normalen Users etwas mehr Rechenlast zu geben (ist ja effektiv das, was die ganzen JS-Lösungen machen), für einen Spammer kann die Rechenlast aber durchaus relevant werden, denn selbst ein Botnetz funktioniert nur solange sich die infizierten User nicht irgendwann fragen, warum ihr Rechner so langsam wird.

Man könnte sich mal überlegen, HTTP um einen Header zu erweitern, meinetwegen X-spam-challenge oder whatever, der mit irgendeiner aufwendig zu berechnenden challenge verbunden ist, die gerade so aufwendig ist, dass sie einen normalen PC mal für eine halbe sekunde auslasten kann, was aber bei Kommentaren oder beim Schreiben von Forenposts nicht sooo schlimm ist, weil man ohnehin damit rechnet, dass das ein paar Sekunden dauert. Für Spambots die ja darauf basieren oft und viel zu posten, wäre das aber möglicherweise zumindest ein Hindernis, denn selbst ein noch so dummer PC-Dau merkt, wenn sein Rechner voll ausgelastet ist, weil er Teil eines Botnetzes ist.

So als Ansatz, weiß nicht, wie gut man das implementieren und durchsetzen könnte, nachdem es ja eine HTTP-Erweiterung wäre, aber zumindest technisch sollte zur Umsetzung alles vorhanden sein.


Hadmut
18.5.2011 16:12
Kommentarlink

Mit WordPress geht das nicht ohne weiteres, und auch im Allgemeinen ist das so nicht möglich, weil viele Webseiten und Blogs auf virtuellen Servern laufen, und man bisher aber nur HTTP und nicht HTTPS ordentlich und mit Unterstützung durch alle Browser virtualisieren kann.

In meinem speziellen Fall könnte ich sowas mit der Neukonstruktion des Blogs sogar tatsächlich ohne größere Probleme (allerdings aus Kostengründen ohne offizielles Zertifikat) bauen. Daß das die Spammer aber irgendwie abhält, wage ich sehr zu bezweifeln.

Der Ansatz mit dem Aufwand wurde bei E-Mail-Spam schon mehrfach verfolgt, bisher ohne Erfolg.


HF
19.5.2011 12:59
Kommentarlink

“Oder man erzeugt das Eingabeformular selbst erst beim Client in JavaScript. Das sind aber alles so Hexenküchenrezepte, die ich eigentlich nicht mag, weil der Angreifer sich daran adaptieren kann, sobald sich der Aufwand für ihn lohnt.”

Wie wäre es mit einer clientseitigen Schlüssel-Berechnung
in Javascript,die einige Sekunden Rechenzeit erfordert? Die Spammer könnten sich anpassen, würden aber in jedem Fall arg ausgebremst.


Hadmut
19.5.2011 14:00
Kommentarlink

Hatten wir doch vor Jahren bei der E-Mail-Spammerei schon, hat doch nicht funktioniert.

Wenn ein Spammer für eine Mail einige Cent von seinem Auftraggeber bekommt, oder wenn er ein Botnetz verwendet, hat der genug Rechenleistung. Jemand, der von unterwegs mit einem batteriebetriebenen Gerät unterwegs ist, Smartphone oder sowas, hat die nicht. Wie sollte das also gehen? Wie willst Du das so bauen, daß es vom Smartphone aus nicht behindert, aber für ein Botnetz mit 100.000 Rechnern eine ernsthafte Hürde darstellt? Geht nicht.

Davon abgesehen sind schon die JavaScript-Implementierungen viel zu unterschiedlich in ihrer Rechengeschwindigkeit.

Ein anderes Problem ist, daß mir sowas auch immer selbst Rechenaufwand beschert. Selbst bei irgendwelchen Falltüralgorithmen oder anderem Zeug mit asymmetrischem Aufwand muß ich da selbst was rechnen. Und da ich mir die Kiste mit mehreren Leute teile, will ich da sparsam sein. Es bringt ja auch nichts, wenn man mit einem solchen Verfahren sich selbst am meisten ausbremst.


_Josh @ _[°|°]_
19.5.2011 21:44
Kommentarlink

Wenn es nicht _zwingend_ ist, daß Du künftig auf WordPress verzichtest: Ich habe als »Nebenherbeauftragter« für eine recht große WordPress-Installation durchweg gute Erfahrungen mit http://didier.lorphelin.free.fr/blog/index.php/wordpress/sabre/ gemacht. Einfach, schnell und zuverlässig, sowohl in Konfiguration, als auch im Endergebnis.

Und als ein in Sachen »Blog« umtriebiger Mensch kann & will ich Dich nur beschwören, von Zwangsregistratur jeglicher Art abzusehen — das führt erfahrungsgemäß nur dazu, die immer gleichen 20 »Hardcorehanseln« mit der immer gleichen »Meinung« im Boot zu haben.

Deine jeweils krassfettschnellen [=,-o] Reaktionen auf meine zwei, drei Postings haben ja bereits bewiesen, daß Du sozusagen »auf Zack« bist, lies, schnell mitbekommst, was die Leute hier in Deinem 11001010-Haus so treiben. Und daß es sowas wie ein völlig autonomes, immerzu korrekt arbeitendes Antispamdingens nicht gibt, das weißt Du als Profi bereits hinlänglich, ein bischen Drüberschaun gehört einfach dazu, ganz besonders in Deinem (überaus prominenten) Fall. =.-)

So stellen sich mir also folgende Fragen: Warum, um Teekannens Willen, möchtest Du Dir die Arbeit machen etwas zu erfinden, daß es bereits mehr oder weniger von der Stange gibt? Ist ‘s akademische Neugier? Oder ist Dir einfach nur langweilig? =;-) Wäre nicht allen Lesern mehr damit gedient, wenn Du bewährte Systeme bei Bedarf selbst optimierst & mehr Energie/ Zeit/ Engagement dafür verwendest, Deine durchaus meist tollen Geschichten & Erlebnisse niederschreibst?

Wäre das nix?


Hadmut
19.5.2011 21:48
Kommentarlink

Mir gehen sowohl PHP, als auch WordPress gewaltig auf den Sack.

Und an WordPress herumzuschrauben habe ich längst aufgegeben, fürchterlicher Sauerkraut-Code, bei dem man sehr deutlich merkt, daß da verschiedene Köche dran rumgebraten haben, stark unterschiedliche Programmierstile.

Außerdem will ich ein paar Features und Funktionen, die es in WordPress einfach nicht gibt. Das ganze Ding wird anders gestrickt werden.


_Josh @ _[°|°]_
19.5.2011 21:58
Kommentarlink

Faaaaaahschdähhhä, dann also was annährs in Zukunft.

Bedankt aber für meine bisherige Hypothese, Du bekommst die Kommentarsachen zeitnah mit: Meine Mitforisten & ich _wissen_ jetzt, Du kontrollierst auch noch das letzte Bit in Echtzeit. Dein wirklicher Name ist nicht zufällig Jack Bauer? =,-o


Hadmut
19.5.2011 22:00
Kommentarlink

Ich kontrolliere nicht in Echtzeit.

Ich hab ne Zeitmaschine.


_Josh @ _[°|°]_
19.5.2011 22:06
Kommentarlink

I lol’d. =.-o
Wann bist Du jetzt? Vor oder nach den 33,4 Mio. DM Lottogewinn im Jahre 1994?


Hadmut
19.5.2011 22:19
Kommentarlink

Du denkst viel zu eindimensional…


_Josh @ _[°|°]_
19.5.2011 22:48
Kommentarlink

??? Hab’ doch bereits die Zeitkomponente einfliessen lassen. Was gibt ‘s denn noch? Irgendwas mit Sex & Cello? =;-o


dustbunny
20.5.2011 22:50
Kommentarlink

>> Du denkst viel zu eindimensional…

Du musst vierdimensional denken, Marty!
(Dr. Emmett L. Brown)

😉


nadar
21.5.2011 17:30
Kommentarlink

Kleines Detail:
Aus den RSS-Feeds kann man nicht viel nehmen, man bekommt nur den ersten Absatz (oder so) geliefert.

Blog-Alternative: iirc hatte ich schon mal auf fefes Blog verwiesen; der ist
> Proudly made without PHP, Java, Perl, MySQL and Postgres
🙂


Hadmut
21.5.2011 17:47
Kommentarlink

Das kann man bei wordpress einstellen, ob der RSS-Feed alles enthält oder nicht. Will ich aber eigentlich nicht.

Nach derzeitiger Planung werde ich ein Redaktionssystem in Rails schreiben, das aber weit überwiegend statische Webseiten erzeugt und nur für die Funktionen dynamisch reagiert, wo es nötig ist.


ne
21.5.2011 22:53
Kommentarlink

Ziemlich effektiv hat sich für mich herausgestellt eindach ein hidden Eingabefeld (am besten mit dem HTML-Namen “email”, “ulr” oder sowas die richtung) in Komentarformulare einzubauen und auf der Serverseite zu prüfen, dass dies auch in der tat leer ist. Die meisten Spambots schreiben da irgentwas rein.


Hadmut
21.5.2011 22:56
Kommentarlink

Das ist ne Idee.

Ich hatte schon was mit den HTML-Namen der Felder überlegt, wollte denen aber eher zufällige bzw. verschlüsselte Namen geben.

Könnte durchaus sinnvoll sein, stattdessen das WordPress-Eingabefeld nachzuahmen und vorzutäuschen und dort dann so eine Erkennung hinzumachen.