Über das Kontaktformular von Kraftsy, einem Onlineshop aus Weyhe, kamen im August immer wieder Nachrichten nach demselben Muster: ein englischer Satz wie „Please add me for news about weekly updates“ (sinngemäß: „Bitte nehmen Sie mich in Ihren Newsletter auf“), jedes Mal von einer anderen E-Mail-Adresse. So schreibt kein Kunde. Dahinter steckten Bots, also Programme, die Formulare automatisch ausfüllen und abschicken.
Das Problem ist nicht nur das volle Postfach. Die angegebenen Adressen sind oft erfunden oder gehören Fremden. Wer sie in den Newsletter übernimmt, schreibt Menschen an, die sich nie dafür angemeldet haben.
Der Grund: Contact Form 7 ohne Spamschutz
Das Formular lief mit Contact Form 7, einer der verbreitetsten Formular-Erweiterungen (Plugins) für WordPress. Es war nicht abgesichert: keine Falle für Bots, kein Captcha, keine Prüfung der Inhalte. Die Erweiterung lässt sich gut schützen, aber den Schutz muss man selbst einrichten.
Warum kein Captcha
Am naheliegendsten wäre ein Captcha gewesen, also eine Prüfung, ob ein Mensch vor dem Bildschirm sitzt: mal als Bilderrätsel wie „Klicken Sie alle Bilder mit Ampeln an“, mal unsichtbar im Hintergrund. Wir haben uns aus zwei Gründen dagegen entschieden. Erstens stört ein Bilderrätsel echte Kunden, und ausgerechnet das Kontaktformular ist oft der letzte Schritt vor einem Kauf. Zweitens schickt zum Beispiel Googles reCAPTCHA Daten der Besucher an Google. Damit kämen Fragen zur Einwilligung im Cookie-Banner und ein weiterer Eintrag in der Datenschutzerklärung dazu, die wir gerade erst aufgeräumt hatten.
Zwei unsichtbare Fallen: Honeypot und JavaScript-Prüfung
Ein unsichtbares Feld. Im Formular steckt ein zusätzliches Feld, ein sogenannter Honeypot (Honigtopf). Besucher sehen es nicht, und auch Screenreader überspringen es. Ein Bot liest dagegen den Quelltext der Seite und füllt meist alles aus, was er findet. Steht etwas im Feld, wird die Nachricht verworfen.
Ein Wert, den nur der Browser einträgt. Beim Laden der Seite trägt ein kleines Skript (JavaScript) unbemerkt einen Wert ins Formular ein. Einfache Bots öffnen die Seite gar nicht wie ein Browser, sondern schicken ihre Daten direkt an die Adresse des Formulars. Bei ihnen fehlt der Wert, und die Nachricht wird ebenfalls verworfen.
Wer abgewiesen wird, sieht eine gewöhnliche Fehlermeldung. Das Formular selbst verrät einem Bot also nicht, woran er gescheitert ist.
Der ehrliche Kompromiss
Wer JavaScript im Browser abgeschaltet hat, kommt an der zweiten Falle nicht vorbei. Im Shop ist das vertretbar: Warenkorb, Kasse und Cookie-Banner funktionieren ohnehin nur mit JavaScript. Wer es abschaltet, kann dort auch nicht einkaufen. Auf einer Website ohne Shop würden wir das neu abwägen.
Eine dritte Idee haben wir verworfen: Nachrichten abzulehnen, die zu schnell nach dem Laden der Seite abgeschickt werden. Dafür müsste der Server beim Aufruf die aktuelle Uhrzeit ins Formular schreiben. Die Kontaktseite von Kraftsy wird aber zwischengespeichert, damit sie schneller lädt. Dann bekämen alle Besucher dieselbe veraltete Uhrzeit mitgeliefert, und die Prüfung würde nichts mehr messen.
Geprüft statt angenommen
Vor dem Start haben wir fünf Fälle durchgespielt. Eine normale Nachricht aus dem Browser wurde durchgelassen. Abgewiesen wurden dagegen
- ein Bot, der das unsichtbare Feld ausfüllt,
- einer, der das Formular ohne JavaScript abschickt,
- einer, der das Feld für den Wert ganz weglässt,
- und einer, der statt des erwarteten Werts Unsinn schickt.
Zusätzlich haben wir eine Testnachricht, aufgebaut genau wie die echten Spam-Nachrichten, direkt an das Formular geschickt. Auch sie wurde als Spam abgewiesen.
Jede abgewiesene Nachricht wird mit Datum, Grund und dem Anfang des Textes protokolliert. Seit Ende August waren es 29, die meisten im September. Wir haben uns jede einzelne angesehen: Preisanfragen auf Baskisch, Griechisch und Vietnamesisch, SEO- und Marketingangebote, ein Angebot für mehr Reichweite auf Instagram, fünfmal dieselbe deutsche Bitte um „weitere Informationen“ unter wechselnden Namen. Eine echte Anfrage war nicht dabei. Ob trotzdem einzelne Spam-Nachrichten durchgerutscht sind, wissen wir nicht sicher: Das Protokoll zeigt nur, was abgewiesen wurde.
Wenn die Bots dazulernen
Reichen die Fallen eines Tages nicht mehr, kommen zwei Dienste infrage: Akismet prüft den Inhalt jeder Nachricht, Cloudflare Turnstile erkennt Bots meist, ohne Besuchern ein Rätsel zu stellen. Beide brauchen ein Konto beim Anbieter, Akismet ist für geschäftliche Seiten kostenpflichtig, und beide gehören dann ebenfalls in die Datenschutzerklärung. Deshalb haben wir mit den zwei Fallen angefangen, die ohne fremde Dienste funktionieren.
Was Sie mitnehmen können
- Prüfen Sie, ob Ihr Formular überhaupt geschützt ist. Kommen regelmäßig sinnlose Nachrichten in fremden Sprachen an, lautet die Antwort meist: nein.
- Spam-Adressen nie in den Verteiler. Eine Nachricht über das Formular ist keine Anmeldung zum Newsletter. Dafür braucht es eine eigene Anmeldung, üblich ist eine Bestätigung per E-Mail (Double-Opt-in).
- Erst unsichtbare Fallen, dann weitere Dienste. Die Fallen halten einfache Bots ab, ohne dass Kunden ein Rätsel lösen müssen.
- Abweisungen protokollieren, aber sparsam. Datum, Grund und der Anfang der Nachricht reichen, damit auffällt, wenn doch einmal ein echter Kunde hängen bleibt. Das Protokoll gehört nicht in einen öffentlich erreichbaren Ordner wie den Upload-Ordner von WordPress, und alte Einträge löschen Sie nach einigen Wochen.
So machen wir es
Ein Kontaktformular sollte von Anfang an einen Spamschutz haben, abgestimmt auf die Seite: so streng wie nötig und so unauffällig wie möglich. Weitere typische Formularfehler beschreibt der Beitrag Ihr Kontaktformular kostet Sie Kunden. Bots klopfen übrigens auch an der Kasse an: Was hinter einer Fake-Bestellung im selben Shop steckte, steht im Beitrag Fake-Bestellung im Onlineshop erkennen.
Was zur laufenden Pflege mit Updates und Datensicherungen gehört, steht auf der Seite WordPress-Wartung. Kommt bei Ihnen Spam an oder bleiben Anfragen aus, schicken Sie uns den Link zu Ihrer Seite. Wir sehen sie uns kostenlos an.