Spamschutz für Formulare ohne Captcha

von Axel von Leitner im August 2014 in Tech

Als wir vor einigen Wochen mit unserem Blog von Wordpress auf eine eigene Lösung umstiegen, wussten wir, dass wir nicht nur einen Editor zum schreiben der Beiträge und ein paar Seiten zum anzeigen brauchen würden. Die größte Herausforderung sollte die Kommentarfunktion mit zuverlässigem Spam-Schutz werden. Und um das Ergebnis vorweg zu nehmen - wir haben es geschafft! Damit Sie nicht alles selbst ausprobieren müssen, präsentieren wir Ihnen stolz wie Bolle: Den perfekten Spam-Schutz für Ihre Formulare.

Viele Webseiten versuchen mit Hilfe von Zeichenfeldern zum Abschreiben, sogenannten Captchas (Completely Automated Public Turing test to tell Computers and Humans Apart), die Spambots auszusortieren. Jeder hasst die immer unlesbaren und unverständlichen Captcha Felder, bei denen man selbst als Mensch häufig mehrere Anläufe benötigt. Ein Captcha war für uns deshalb keine Option. Wir hatten ein paar Ideen, wollten aber zunächst einmal ganz ohne speziellen Spam-Schutz starten, um zu sehen wie groß die Flut überhaupt wird. 

Formular ohne Spamschutz?

Im ersten Versuch ging unser Kommentar Formular also ohne besonderen Schutz online. Ein einfaches Formular mit Name, E-Mail Adresse und Kommentarfeld. Das Ergebnis war ernüchternd: Am nächsten Tag war der Blog voll mit Spam-Kommentaren. 
Also gut, die erste Runde ging an die Bots. Im zweiten Versuch erweiterten wir das Formular um ein zusätzliches Textfeld, welches wir versteckten. Die Idee dahinter ist einfach: Der Bot kann nicht unterscheiden, welche Felder sichtbar und welche unsichtbar sind. Er wird auch in das für Menschen nicht sichtbare Feld hinein schreiben, ein Mensch jedoch nicht. Diese versteckten Felder nur für Bots nennt man Honeypots (Honigtöpfe), von denen die Bots die Finger nicht lassen können. Wenn also das versteckte Feld ausgefüllt wird, schicken wir den Bot weg und verwerfen den Kommentar. 

Das Ergebnis? Weniger Spam-Kommentare, aber wir waren noch weit weg von spamfrei. 
In der nächsten Iteration wollten wir darauf wetten, dass die (meisten) Bots kein JavaScript können. Wir haben das Formular zunächst als disabled in die Seite gerendert. Es wird dann erst beim Klick auf den Link zum Verfassen eines neuen Kommentars aktiviert. 

So sieht der Link vor der Aktivierung aus...
Thumb formular zugeklappt
... und so nach der Aktivierung:
Thumb formular aktiviert
Das hat jedoch wenig geändert, vermutlich weil Bots einfach jedes Formular auf aktiv stellen und versuchen es abzuschicken. 

Im nächsten Schritt haben wir die Feldbenennungen vertauscht. Das typisch benannte content feld heißt nun bot_protect, das versteckte Feld haben wir content genannt. Und sobald etwas im Fake content Feld steht, verwerfen wir alles. 
Trotzdem, noch immer hatten wir über Tage hinweg einzelne Spam-Kommentare. Unsere Vermutung war, dass einige Bots es schlicht mit Trial and Error schaffen, durch zu kommen. Wir waren und sind noch immer skeptisch, dass man Bots mit Sessions, Cookies oder IP-Blockern wirklich habhaft werden kann, aber auch damit haben wir es versucht. 
Zum einen setzen wir Session-Variablen, wenn wir denken, es handelt sich um einen Bot. Sobald die Session-Variable gesetzt ist, verwerfen wir alle weiteren Kommentarversuche dieses Besuchers. Die Sperrung spezieller IPs haben wir auch einmal kurz ausprobiert, dann aber relativ schnell wieder raus genommen weil sie keinen großen Effekt brachte und wir nicht unnötig IPs sammeln wollten. 

Der finale Trick zum Spamschutz

Wir haben viel probiert und ganz zum Schluss haben wir unser display: none im CSS einer umliegenden Klasse des Fake content Eingabefeldes ersetzt gegen eine minimale Höhe. Das Feld wird also jetzt nicht mehr ganz ausgeblendet, sondern hat eine minimale Höhe. Es ist damit für Menschen noch immer nicht sichtbar, Bots denken aber offenbar es wäre ein normales Feld. Bislang fallen alle Bots darauf rein, schreiben in das Feld und wir verwerfen den Inhalt. 
Thumb html formular spamschutz
Seitdem sind wir spamfrei und müssen uns nicht tagein tagaus über Spam-Kommentare, ungültige Anmeldeversuche und mehr ärgern - so wie zuvor bei dem Standard Wordpress Blog auf dessen URL- und Formularstruktur die Bots natürlich trainiert sind. 

Hier noch einmal die Auflistung der Maßnahmen, die bei uns bislang für absolute Spam-Freiheit sorgen: 
Mal davon abgesehen, dass es Spaß macht gegen die Bots zu kämpfen, haben wir mit relativ wenig Aufwand eine spamfreie Kommentarfunktion geschaffen, ohne dass wir die Nutzer zu irgendeiner Eingabe oder Rechnung zwingen müssen. Das klappt natürlich nicht mehr, wenn die Spammer sich mit dem speziellen Formular beschäftigen und den Bot darauf trainieren. Bei 99,9% der Webseiten und Formulare ist das aber nicht der Fall. 
Ich freue mich über eure Erfahrungen oder Lösungen zum Spamschutz in den Kommentaren. Wie haltet ihr euch die Spambots vom Hals?
Tags dieses Artikels: Beispiel, Entwicklung und Webdesign

Es gibt 13 Kommentare zu diesem Artikel.

Hannes am Dienstag, 05.08.2014

Ich setze auf Akismet in meinem WP-basierten Blog. Funktioniert bisher ganz gut. Habt ihr den Dienst für auch von der Nutzung ausgeschlossen?

Axel von Leitner (42he Team Mitglied) am Dienstag, 05.08.2014

Hey Hannes,

wir nutzen hier kein Wordpress mehr, sondern haben eine Eigenentwicklung. Bei Wordpress hatte wir auch Akismet meine ich und das meiste hat das in der Tat auch rausgefiltert. Akismet sammelt aber wenn ich es richtig verstehe einiges an Daten, um zu bestimmen was ein Spam Kommentar ist und was nicht. Wir machen es jetzt rein vom Verhalten abhängig und gucken uns den eigentlichen Inhalt nicht an.

Gruß
Axel

Michael am Dienstag, 05.08.2014

Wenn ich das recht verstehe habt ihr da ein paar gängige Methoden zur Spam-Verhinderung nachgebaut, welche bereits viele simple Antispam Plugins (Nicht nur für WordPress, auch in Drupal, Typo3 etc.) beherrscht. Erfahrungsgemäss sollten an all' den verfahren aber immer noch relativ viele Bots vorbei kommen - Es kommen wahrscheinlich nur viel weniger "intelligente" Bots auf eure Seite, weil die erkennen, dass ihr kein WordPress einsetzt und das hacken damit gar nicht besonders interessant ist.

Axel von Leitner (42he Team Mitglied) am Dienstag, 05.08.2014

Hey Michael,

damit hast du sicher recht. Dass wir kein Standard System einsetzen ist wahrscheinlich der Hauptgrund und auch deshalb haben wir Wordpress neulich erst aufgegeben und uns die Arbeit gemacht das eigene Blog-System zu schreiben.
Und auch wenn das nicht jeder macht - ein einfaches Kontaktformular findet man doch auf vielen selbstgebauten Webseiten und da gibt es dann ein ähnliches Problem.

Ich hatte auch in erster Linie Spaß daran auszuprobieren, welches Mittel welche Wirkung zeigt. Natürlich nutzen viele Plugins ähnliche Mittel zur Spam-Prävention. Welche dann am Ende das gewünschte Ergebnis bringen wird aber nicht immer klar.

Gruß
Axel

Michael am Dienstag, 05.08.2014

Absolut, ich habe damals die gleiche Erfahrung gemacht mit einem selbst entwickelten CMS - Soweit ich mich erinnere sogar mit den gleichen Vorkehrungen. Noch heute habe ich dort 20-30 "Angriffe" pro Monat, weil das System total uninteressant ist, bei WordPress hingegen bis zu mehrere tausend Requests am Tag, gegen die wir uns zusätzlich zu Antispam Plugins mit einer Art Memcached basierten "Software-Firewall" schützen, welche das System vor Überlastungen schützt.

Axel von Leitner (42he Team Mitglied) am Dienstag, 05.08.2014

Ja klar, bei Wordpress hatten wir auch deutlich mehr Versuche. Was du beschreibst klingt auch spannend - hast du darüber mal irgendwo geschrieben? Oder Literatur? Oder willst hier darüber schreiben? ;-)

Viktor am Mittwoch, 07.12.2016

Bots sind leider schlauer geworden. Dieser Trick zieht nicht mehr, da aktuell Bots unterwegs sind, die NICHT alle Formularfelder ausfüllen und deren Eingabe dann rotiert. Die probieren eben alle Kombinationen durch. Meist ist es ja ein Kreuzprodukt aus nur wenigen Feldern.

Henry N. am Freitag, 18.08.2017

Habe festgestellt, dass Bots sehr wirkungsvoll durch selbst ausgedachte Aktionen abgehalten werden können. Eigene Kreativität schützt hier effektiver, als vorgefertigte und weit bekannte Tools. Auf meinen Seiten gibt es ein verstecktes Feld, dass per JavaScript gefüllt wird. Der Benutzer kann das Feld ncht ausfüllen, weil es ein sogenanntes Hiddel input ist, welches man üblicherweise für Konstanten benutzt. Der Inhalt ist ein Fingerabdruck des Browsers, der sich aus Daten zusammen setzt, die der Browser in anderer Form bereits im Header des HTTP-Post mit gibt, z.B. die Browsrkennung. Bisher hat noch kein Bot das geschafft. Natürlich könnte jeder seinen Bot so trainieren, dass das Feld einen gültigen Wert hat. Der Code ist ja im JavaScript "lesbar". Aber die Mühe ist es wohl nicht wert.

Auf einer anderen Seite haben wir bemerkt, dass gerade durch das verwendete Captcha ein Botnetz sozusagen angelockt wurde. Dort haben wir ebenfalls Honeypots eingebaut und die Feldnamen werden zufällig generiert. Interessant dabei war, dass der Bot nach dem Hinzufügen des Honeypots eindeutig verändert wurde. Jemand hat versucht, den Honeypot an Hand der Position der Felder zu finden, weil die Namen der Felder ja nun nicht mehr aussagekräftig waren. Das hatten wir jedoch schon bedacht, und den Honeypot immer wieder an anderer Stelle positioniert. Zu sehen war, wie der Bot versucht hat nun in mehrere Felder die Email-Adresse einzutragen.

Die Bots sind heutzutage sogar so gebaut, dass die typischen Klicks eines Besuchers nachempfunden werden. So startete unser Freund immer auf der Homepage und gab bei jeder neuen Seite auch immer schön den Referer an. Sogar die PHP-Session wurde korrekt bearbeitet. Was in dem Fall für uns natürlich von Vorteil war, weil wir mit der Session unsere zufälligen Feldnamen wieder zurück wandeln können. Der Bot wartete sogar immer ungefähr 5 Sekunden zwischen dem GET und POST.

Axel von Leitner (42he Team Mitglied) am Montag, 21.08.2017

Hey Henry, Danke für deine Erfahrungen und den Tipp. Wir sind bislang auch noch Botfrei, das wäre aber noch eine Ergänzung.

Für relativ kleine Seiten, die eben mit keinem weit verbreiteten CMS laufen, gibt es mit kleinen Tricks sicher noch eine Zeit lang Ruhe. Da bin ich bei dir.

test am Freitag, 27.10.2017

test

test am Freitag, 27.10.2017

test2

Britta am Donnerstag, 08.11.2018

Hallo,
ich suche eine Möglichkeit, zu verhindern, dass im Message-Feld ein Link eingegeben werden kann. Alle Spam-Mails vom Formular (contact form 7) haben einen Link, die normalen Anfragen nie.
Hat jemand dazu eine Idee?
Vielen Dank im voraus
Britta

Britta am Donnerstag, 08.11.2018

Gelöst: Gerade die Blacklist gefunden :-)

Und was denken Sie? Schreiben Sie einen neuen Kommentar. Wir freuen uns auf Ihren Beitrag.


Aws4 request&x amz signedheaders=host&x amz signature=233bd1dbdb47a186fb3b883467abc4a5b1e88113a9059f6304fcb36e7a94873a

Axel von Leitner

Mitbegründer von 42he. Beschäftigt sich mit den betriebswirtschaftlichen Dingen und steckt viel Herzblut in Design & Usability.
Axel schreibt insbesondere über Produktivität, Design und Startup-Themen.


Lesen Sie mehr Artikel aus der Kategorie Tech:
  • Der Lock-In-Effekt lockt mal wieder
  • Warum Ihre Browserwahl nicht völlig egal ist
  • 100%+ Test Coverage vs. Pivots und Rapid Prototyping: Wie macht man es richtig?