Ein Formular ohne Captcha vor Spam schützen: von Akismet zu meinem eigenen Spamschutz
Im November 2016 veröffentlichte ich in meinem WordPress-Blog einen Beitrag mit dem Titel „Wie richtet man Akismet ein?“. Ich erklärte darin, wie man das mit WordPress mitgelieferte Anti-Spam-Modul aktiviert, auf der offiziellen Website einen API-Schlüssel holt und dann zwischen dem direkten Löschen unerwünschter Kommentare und einem Prüfordner von vierzehn Tagen wählt. Ich teilte sogar einen kleinen Filter, den man in functions.php einfügt, um diese Frist auf dreißig Tage zu verlängern, mit einem Satz, der eigentlich schon alles zusammenfasst: „wir sind nie vor einem falsch Positiven sicher.“ Zehn Jahre später schütze ich keine Blogkommentare mehr, sondern die Formulare meiner eigenen Website, gebaut auf Pulsar, meinem PHP-Framework. Und dieser Reflex von 2016, eine zweifelhafte Nachricht lieber zu behalten als eine gute zu verlieren, ist zur zentralen Regel des Spamschutzes geworden, den ich am Ende selbst geschrieben habe.
Was Akismet mir beigebracht hat
Damals delegierte ich alles. Akismet kombinierte ein Wörterbuch unerwünschter Schlagwörter, ein Regelwerk und eine schwarze Liste und sortierte Kommentare in wartend oder Spam ein. Für einen Blog funktionierte das gut, und ich empfahl es ohne Vorbehalt.
Aber Delegieren hat einen Preis. Jede Nachricht wandert zur Analyse auf fremde Server, was bei einem Kontaktformular, auf dem ein Interessent seinen Namen und seine E-Mail-Adresse hinterlässt, zu einem echten DSGVO-Thema geworden ist. Und vor allem hat sich der Preis eines falsch Positiven in der Größenordnung verändert: ein verlorener Blogkommentar ist schade. Eine verlorene Angebotsanfrage ist ein Kunde, der nicht zurückkommt. Meine alte Website brach am Ende unter dem Spam über das Kontaktformular zusammen, und beim Neudenken der neuen setzte ich eine Ausgangsbedingung: ernsthaft filtern, ohne die Rechnung jemals den Menschen zahlen zu lassen.
Warum kein sichtbares Captcha
Die übliche Antwort auf Spam ist ein Captcha. Ich habe sie aus drei Gründen verworfen.
Zuerst die Reibung. Jeder Schritt, der vor dem Absenden hinzukommt, lässt echte Besucher abspringen, während ernsthafte Bots diese Rätsel lösen oder von Klickfarmen lösen lassen. Man verliert Menschen, um Maschinen auszubremsen, die längst nicht mehr ausgebremst werden.
Dann die Barrierefreiheit. Ampeln in verschwommenen Kacheln zu erkennen schließt sehbehinderte Menschen aus, und die Audio-Alternativen sind für alle mühsam.
Schließlich der Datenschutz. Die Captchas der großen Plattformen laden Skripte Dritter, beobachten das Verhalten des Besuchers und werfen Einwilligungsfragen auf, die ich nicht verwalten wollte. Meine Website ruft für ihre Formulare keinen einzigen externen Dienst auf: alles ist selbst gehostet, nichts verlässt das Haus.
Ein Captcha bestraft den Menschen für ein Problem, das von Bots verursacht wird. Ich wollte das Gegenteil: Prüfungen, die nur Bots bemerken.
Fünf unsichtbare Schichten statt einer Mauer
Keine Prüfung ist für sich allein perfekt. Gestapelt halten sie den Großteil des automatisierten Spams auf, ohne dass der Besucher irgendetwas davon sieht. Ich bleibe bewusst auf der Ebene des Konzepts: Feldnamen oder exakte Schwellenwerte zu veröffentlichen käme dem Aushändigen der Umgehungsanleitung gleich.
Der Honeypot. Ein für Menschen unsichtbares Feld, das Bots ausfüllen, weil sie alles ausfüllen. Das entscheidende Detail: die Website antwortet dem Bot „Nachricht gesendet“, ohne etwas zu senden. Er weiß nicht, dass er erkannt wurde, also lernt er nichts.
Die Zeitfalle. Beim Rendern des Formulars gibt der Server einen kryptografisch signierten Zeitstempel aus. Ein Mensch braucht Sekunden, oft Minuten, um ein Formular zu lesen und auszufüllen. Ein Bot sendet fast augenblicklich. Die Signatur macht das Token fälschungssicher, und die Schicht blockiert nur bei einem positiven Nachweis der Automatisierung: ein fehlendes oder beschädigtes Token blockiert nie, die anderen Schichten decken diesen Fall ab. Sie funktioniert ohne JavaScript.
Die unsichtbare Challenge. Eine kleine kryptografische Berechnung (ein Proof of Work), die der Browser ganz allein im Hintergrund löst, in Sekundenbruchteilen, während der Besucher schreibt. Für einen Menschen nicht wahrnehmbar, teuer für einen Bot, der massenhaft sendet. Selbst gehostet, ohne API-Schlüssel und ohne Dienst Dritter. Und wenn der Browser kein JavaScript ausführt, blockiert die fehlende Antwort das Absenden nicht: die serverseitigen Schichten übernehmen. Graceful Degradation gilt auch für die Sicherheit.
Die Ratenbegrenzung. Ein Bot, der das Formular von derselben Adresse aus überflutet, wird nach einigen Versuchen ausgebremst. Die IP-Adresse wird vor jeder Speicherung gehasht, ich bewahre sie nie im Klartext auf.
Das Inhalts-Scoring. Linkdichte, Textqualität, Erkennung von Dubletten. Jedes Signal zählt Punkte zu einem Score hinzu, und genau hier weicht die Philosophie von klassischen Filtern ab: dieser Score lehnt nie ab.
Die Regel vom null verlorenen Lead
Meine Pipeline unterscheidet zwei Familien von Prüfungen. Positive Nachweise der Automatisierung, wie der Honeypot oder die Zeitfalle, lehnen ab. Inhaltssignale lehnen nie ab: eine Nachricht mit hohem Score wird trotzdem zugestellt, einfach zur manuellen Durchsicht in meinem Postfach markiert.
Ein echter Kunde, der drei Links zu seiner bestehenden Website einfügt oder zwei knappe Zeilen vom Handy schreibt, kommt durch. Ich lese lieber zwei Spam-Nachrichten, als eine Anfrage zu verlieren. Das ist genau die Logik meiner dreißig Tage Akismet-Prüfzeit von 2016, bis zum Ende gedacht: der Zweifel kommt immer der Nachricht zugute.
Wie das in der Praxis aussieht
Auf der Kontaktseite wie auch im Angebotsrechner sieht der Besucher nichts davon. Kein Kästchen „Ich bin kein Roboter“, kein Rätsel, kein Einwilligungsbanner für ein Skript Dritter. Das Formular füllt sich aus und sendet, fertig.
Wenn Ihr eigenes Formular unter Spam zusammenbricht, passt mein Vorschlag in einen Satz: bevor Sie ein Captcha hinzufügen, das Ihre Besucher vertreibt, stapeln Sie unsichtbare Prüfungen und behalten Sie die Ablehnung den Nachweisen der Automatisierung vor. 2016 beendete ich meinen Beitrag mit der Einladung, zu kommentieren und zu teilen. 2026 ist die ehrliche Fassung einfacher: wenn das Thema Sie anspricht, schreiben Sie mir über genau dieses Formular. Es hält stand.