Spam im Kontaktformular bei PrestaShop: Warum ein Spamfilter mit verbotenen Wörtern nicht funktioniert
Zwei Arten, Zeit zu verlieren, und die zweite ist schlimmer
Im Postfach, das die Nachrichten aus dem Kontaktformular empfängt, landet zweierlei: Anfragen von Kunden und unaufgeforderte Angebote, also Suchmaschinenoptimierung, Linkaufbau, Entwickler auf Stundenbasis, Einladungen, in Kryptowährungen zu investieren, und hin und wieder der Versuch, sich die Zugangsdaten zum Back Office herausgeben zu lassen.
Die erste Art, Zeit zu verlieren, ist, alles zu lesen. Die zweite, schlimmere, ist, aufzuhören zu lesen: Ist fast alles Müll, wird die gute Nachricht nur noch im Vorbeigehen angesehen. Ein verlorener Kontakt hinterlässt keinen Fehler in den Logs, er hinterlässt einen Kunden, der geht, ohne zu sagen, warum.
Warum eine Liste verbotener Wörter nicht funktioniert
Die verbreitetste Abwehr ist eine Wortliste: Enthält die Nachricht „SEO“, „kostenlos“, „Angebot“, wird sie verworfen. Das funktioniert eine Woche, dann kommt die Rechnung, denn die Wörter, die im Spam vorkommen, sind dieselben, die Kunden benutzen. „Ich habe gesehen, dass Sie eine Aktion auf das Schraubendreher-Set haben: Ist der Versand ab 49 Euro auch auf die Inseln kostenlos?“ ist ein Kunde kurz vor dem Kauf.
Der Fehler liegt nicht in der Liste, sondern in der Methode: Ein Wort trägt nicht die Absicht dessen in sich, der es geschrieben hat. Das gilt auch umgekehrt, denn gut geschriebener Spam enthält kein verdächtiges Wort. Erhöht man die Strenge, blockiert man mehr echte Kunden; senkt man sie, lässt man mehr Spam durch: Keine Einstellung löst das Problem, weil es nicht das richtige Signal ist.

Warum das Captcha nicht reicht
Das Captcha löst ein anderes Problem, und es löst es gut: Es verhindert, dass ein Programm das Formular tausendfach ausfüllt. Es hindert keinen Menschen daran, ein Verkaufsangebot zu schicken, und auch kein Programm, das es lösen kann, dasselbe zu tun. Captcha, Honeypot und Limit für Sendungen pro IP sehen darauf, wie die Nachricht angekommen ist; hier liegt das Problem darin, was darin steht.

Ein Modell, das entscheidet, statt zu schreiben
Die Antwort, die gerade in Mode ist, auf „Ist diese Nachricht Spam?“ besteht darin, ein Sprachmodell zu befragen: Man schreibt einen Prompt und hofft, dass sich der zurückgelieferte Text deuten lässt. Das geht gut, bis das Modell eines Tages antwortet „Ich würde sagen, ja, auch wenn es darauf ankommt“, und der Code, der JA oder NEIN erwartet hat, nach Zufall entscheidet.
Es gibt einen Modelltyp, der für den umgekehrten Fall gedacht ist: Er erzeugt keinen Text, er beantwortet typisierte Fragen. Er liefert für jede eine Zahl: bei einer Ja/Nein-Frage die Wahrscheinlichkeit, dass die Antwort Ja lautet; bei einer Multiple-Choice-Frage die gewählte Option, die Wahrscheinlichkeit jeder einzelnen und einen Konfidenzwert, also wie deutlich diese Wahl im Vergleich zu den anderen ist. Die Funktion Antispam Jev unseres Kontaktformular-Moduls ist auf einem dieser Modelle aufgebaut, Jev von TypeSafe AI.
Der praktische Unterschied ist, dass die Entscheidung im Code bleibt: Das Modell sagt, wie sicher es ist, und was daraus folgt, bestimmt eine Schwelle, die der Händler ändern kann. Für jede Nachricht gehen sechs Fragen in einem einzigen Aufruf hinaus, parallel bewertet: Ist es unaufgeforderte Werbung, enthält sie verdächtige Links, ist es Phishing, ist es eine in Masse versandte Vorlage, welche Abteilung sollte antworten, ist es dringend.

Der wichtigste Punkt ist der dritte Zustand. Über der oberen Schwelle handelt man, und die Nachricht kommt in eine Warteschlange für verdächtige Nachrichten; darunter tut man nichts, sie kommt durch, und die Bewertung bleibt im Protokoll; dazwischen, wo das Modell schwankt, braucht es die Bestätigung durch ein zweites Signal. „Ich weiß es nicht“ ist eine nützliche Antwort, wenn der Code so geschrieben ist, dass er darauf hört.

Was wir gemessen haben
Diese Zahlen stammen aus einem Test, den wir auf einer Entwicklungsinstallation von PrestaShop 9 gemacht haben, nicht aus einem unabhängigen Test: zehn von uns auf Italienisch verfasste Nachrichten, sechs legitime und vier unerwünschte.
Die sechs legitimen waren so gewählt, dass sie schwierig sind: ein verärgerter Kunde, der eine Rückerstattung verlangt und droht, die Zahlung bei seiner Bank anzufechten, eine Nachricht ganz in Großbuchstaben, eine mit dem Link auf die Website seines Unternehmens, eine sehr lange und verworrene, eine aus zwei Wörtern auf Italienisch („Liefern Sie nach Sizilien?“) und die voller „kostenlos“, „Angebot“ und „Aktion“. Alle sechs kamen durch, mit einer Wahrscheinlichkeit für unaufgeforderte Werbung, die bei 2 % oder weniger blieb. Die vier unerwünschten (SEO-Angebot, Phishing mit verkürztem Link, Einladung zum Investieren, allgemeine Massenvorlage) kamen alle in die Warteschlange für verdächtige Nachrichten, zwischen 98 % und 99 %.
Die zehn Aufrufe dauerten zwischen 535 und 663 Millisekunden, im Durchschnitt 596 ms, bei einem Verbrauch von etwa 900 bis 1.240 Token pro Nachricht. Bei deaktivierter Funktion dauerte derselbe Versand 95 ms: Die halbe Sekunde mehr ist der Preis der Bewertung, und man zahlt ihn nur, wenn man sie einschaltet.
Der Test, der uns am meisten interessierte, war ein anderer: Wir ließen das Modul auf eine Adresse zeigen, die nicht antwortet. Nach 4.057 Millisekunden, also der eingestellten Wartezeit, wurde die Nachricht normal zugestellt und der Fehler ins Protokoll geschrieben. Dasselbe gilt, wenn der Schlüssel fehlt, und bei einem falschen Schlüssel.

Was er bewusst nicht tut
Er löscht nichts. Erkannter Spam kommt in eine Warteschlange, die der Händler öffnet und liest und aus der er eine Nachricht mit einem Klick zurückholen kann, woraufhin die zurückgehaltene Benachrichtigung versandt wird. Der Besucher sieht in jedem Fall den Bestätigungsbildschirm: Wer Spam schickt, dem erklärt man nicht, wie er gefiltert wurde, und ein Kunde, der irrtümlich dort landen sollte, wird nicht abgewiesen.
Er setzt sich nicht über die Entscheidungen des Händlers hinweg: Die Weiterleitung wählt unter den im Modul tatsächlich eingerichteten Abteilungen und greift nur dort ein, wo früher die allgemeine Adresse verwendet worden wäre. Unterhalb der Konfidenzschwelle bleibt der Standardempfänger.
Die Grenzen, vorab genannt
Der Text der Nachricht wird an einen Drittanbieter in den USA gesendet: Das ist eine Übermittlung personenbezogener Daten außerhalb der Europäischen Union, die in der Datenschutzerklärung des Shops stehen muss. Deshalb ist die Funktion standardmäßig deaktiviert, deshalb nennt das Panel im Klartext, was hinausgeht und an wen, deshalb ist das Senden der E-Mail-Adresse des Absenders ausgeschaltet, außer man entscheidet sich ausdrücklich dafür, und deshalb liefert das Modul einen fertigen Satz zum Einfügen in die Datenschutzerklärung in fünf Sprachen: ein Text, den Sie anpassen und prüfen lassen müssen, keine Rechtsberatung.
Der Dienst ist neu und wird nach Verbrauch abgerechnet: Ist das Guthaben aufgebraucht, antwortet er nicht mehr, und die Nachrichten kommen durch wie bei jedem anderen Fehler. Und zehn Nachrichten zeigen, dass der Filter bei diesen zehn nicht falsch lag, nicht dass er nie falsch liegen wird: Deshalb gibt es die Warteschlange, und deshalb wird jede Bewertung mit Wahrscheinlichkeit, Konfidenz, Zeit und Token gespeichert.
Wo Sie ihn finden
Antispam Jev ist eine Funktion unseres Kontaktformular-Moduls für PrestaShop, kein eigenes Modul: Wer es schon nutzt, findet sie in der Konfiguration, deaktiviert. Erkennen Sie sich in dem zweiten Problem dieses Artikels wieder, der echten Nachricht, die zwischen den anderen verloren geht, dann ist sie genau dafür entstanden.


