Markus Michalski FAQ

ALTCHA: Inhaltsprüfungen

ALTCHA Spam-Schutz für Sylius - Wegwerf-E-Mail- und Gibberish-Prüfung im Detail: Geltungsbereich, Abgleich, Bewertung, Protokollierung und schrittweise Einführung ohne Fehlalarme

English Version

Zurück zur Übersicht

ALTCHA: Inhaltsprüfungen

Live Demo: Teste dieses und weitere Plugins live — ohne Installation, ohne Risiko: demo.markus-michalski.net

Zwei optionale Prüfungen schauen nicht darauf, wie eine Absendung kam, sondern was darin steht: die Wegwerf-E-Mail-Prüfung und die Gibberish-Prüfung. Beide schaltest du pro Channel in den Einstellungen ein, beide sind standardmäßig aus. Sie laufen nach Rate-Limit, Honeypot und Mindest-Ausfüllzeit und vor der Proof-of-Work-Prüfung, eine abgelehnte Absendung verbraucht also keine Challenge.

Beide Prüfungen sind Hilfsmittel, keine Garantie: Sie senken das Rauschen, fangen aber nie jeden Spam und können in Einzelfällen einen echten Kunden treffen.

Wegwerf-E-Mail-Prüfung

Lehnt eine Absendung ab, deren E-Mail-Adresse zu einem bekannten Wegwerf-Anbieter gehört (Mailinator und ähnliche Dienste für Wegwerf-Postfächer). Einschalten: Einstellung E-Mail-Adressen von Wegwerf-Anbietern ablehnen im Channel. Ist sie aus, ändert sich nichts.

Wo sie gilt

Bei jedem geschützten Schutzziel, dessen Absendung eine E-Mail-Adresse enthält: Registrierung, Kontakt, die Anmeldungen für Newsletter und Support-Formular und eigene Formulare mit E-Mail-Feld. Nicht bei login, checkout_login und password_reset_request, obwohl das Letzte ein E-Mail-Feld hat. Diese Schutzziele wirken auf ein Konto, das schon existieren kann. Wer sie nach dem Ruf der E-Mail-Domain ablehnt, sperrt einen echten Kunden aus seinem eigenen Konto aus, statt neuen Spam zu stoppen.

Eine abgelehnte Absendung bekommt in der Shop API den Grund disposable_email (HTTP 422, dasselbe {message, reason}-Format wie jede andere Ablehnung) und eine neutrale Meldung, die nie die Sperrliste nennt.

Datenquelle und Aktualisierung

Das Plugin liefert einen Schnappschuss der CC0-lizenzierten Liste disposable-email-domains/disposable-email-domains in data/disposable-email-domains.conf mit. Zur Laufzeit geht keine Anfrage ins Netz: Die Datei wird einmal in den Speicher gelesen und für den Rest der Anfrage behalten. Ein langlebiger Worker (FrankenPHP, RoadRunner) liest sie bei der nächsten Anfrage neu, statt sie über Anfragen hinweg zu halten.

Aktualisieren kannst du die Liste über den Scheduler deines Hosts (wöchentlich genügt):

bin/console mmd:altcha:update-disposable-domains

Der Befehl lädt die Upstream-Liste nach var/mmd_sylius_altcha/disposable-email-domains.conf und schlägt geschlossen fehl: Bei einem Netzwerkfehler oder einer leeren bzw. nicht lesbaren Antwort bleibt die bisherige Datei (mitgeliefert oder zuvor aktualisiert) erhalten, statt die Prüfung durch eine leere Liste faktisch abzuschalten.

Abgleich

Die übermittelte Domain und jede übergeordnete Domain zählen (foo.mailinator.com trifft, weil mailinator.com gelistet ist), nie der nackte Public Suffix allein. Das ist ein Abgleich Ebene für Ebene, kein vollständiger Public-Suffix-List-Lookup: Eine registrierbare Domain unter einem mehrteiligen Suffix (spam.co.uk) wird zusätzlich eine Ebene zu hoch geprüft (co.uk). Das ist harmlos, weil niemand einen Public Suffix selbst als Wegwerf-Domain listet. IDN-Domains werden in ihrer ASCII-Form (Punycode) verglichen, wenn ext-intl verfügbar ist, sonst so, wie sie übermittelt wurden.

Eigene Ausnahmen

Admin -> MMKreativ Plugins -> ALTCHA Spam-Schutz -> Button ALTCHA Wegwerf-Mail-Ausnahmen. Zwei Arten von Einträgen, beide werden wie die mitgelieferte Liste abgeglichen:

Auf der Seite der Ausnahmen öffnet der Button ALTCHA geblockte Domains eine schreibgeschützte, durchsuchbare Liste aller Domains, die die Prüfung gerade blockt (die mitgelieferte oder aktualisierte Liste plus deine eigenen Einträge zum Ablehnen). Einen Eintrag zum Ablehnen für eine Domain, die schon geblockt wird (selbst oder über eine übergeordnete, etwa x.mailinator.com über mailinator.com), lehnt das Plugin ab und nennt den Eintrag, der sie schon abdeckt. Ein Eintrag zum Erlauben für eine Domain, die nichts blockt, wird gespeichert, mit dem Hinweis, dass er noch keine Wirkung hat.

Gibberish-Prüfung

Bewertet die Textfelder einer Absendung und lehnt ab, was sehr wahrscheinlich sinnlos ist, etwa Tastaturgeklapper (fdsgsdfgsdf, asdfasdf, qwertzuiop). Sie ist die Schicht nach Honeypot und Mindest-Ausfüllzeit für jemanden oder ein Skript, das die Proof-of-Work-Aufgabe tatsächlich löst. Einschalten: Einstellung Sinnlosen Freitext ablehnen im Channel. Ist sie aus, ändert sich nichts.

Was sie ansieht

Nur Freitextfelder: die TextType- und TextareaType-Felder eines Formulars (nie E-Mail, Passwort, URL, Telefon oder Auswahlfelder). In einer Shop-API- oder Event-Anfrage sind es die Schlüssel message, subject, name, firstName, lastName, fullName, comment, comments, text, body, description, content, note, notes, title, question und remarks, eine Ebene tief in verschachtelten Objekten. Groß- und Kleinschreibung sowie Bindestriche und Unterstriche im Schlüssel spielen keine Rolle (first_name zählt wie firstName). Die Prüfung gilt für jedes geschützte Schutzziel mit solchen Feldern (Kontakt, eigenes Formular, das Support-Formular über seine Anfrage) und, wie die Wegwerf-E-Mail-Prüfung, nie für login, checkout_login und password_reset_request. Jedes Feld wird einzeln bewertet, das schlechteste entscheidet.

Wie sie bewertet

Jedes Wort wird nach drei Signalen beurteilt. Der Score (0 bis 100) ist der Anteil der Buchstaben in auffälligen Wörtern an den Buchstaben aller beurteilten Wörter, gewichtet danach, wie viel Beleg der Text liefert:

Gar nicht beurteilt werden URLs, E-Mail-Adressen, Code-Blöcke, jedes Token mit Ziffer, Unterstrich, Schrägstrich, Punkt oder anderem Symbol (Pfade, Klassennamen, Stacktraces, Hashes, Lizenzschlüssel, SQL) und jedes Wort, das nicht in lateinischen Buchstaben geschrieben ist. Kurzer Text liefert wenig Beleg: Ein einzelnes ungewöhnliches Wort (ein polnischer Nachname wirkt für eine Tabelle ohne Polnisch unplausibel) kann den Score etwas erhöhen, aber nie allein ablehnen, eine lange Tastaturfolge dagegen schon. Ein großgeschriebenes Wort zählt weniger, weil es meist ein Name ist. Ein einzelnes kurzes Wort mit drei Buchstaben ist nie ein Beleg (pdf, csv und sql sehen genau aus wie drei zufällige Buchstaben). Tokens mit weniger als fünf Buchstaben zählen nur, wenn sie unplausibel wirken und zusätzlich entweder mindestens dreimal vorkommen (sdf sdf sdf) oder eine Tastaturreihe mit genau vier Buchstaben sind (asdf). Der Anteil bezieht sich auf die Buchstaben der beurteilten Wörter, also derer mit fünf Buchstaben und mehr (dazu kommen die kurzen Tokens, die eine Tastaturreihe oder Wiederholung sind); deshalb fällt ein zufälliges Wort zwischen ein paar kurzen ehrlichen weiterhin auf.

Zwei Schwellen und Protokollierung

Ab dem Ablehn-Score (Standard 85) wird die Absendung mit der neutralen Meldung „Your message could not be accepted" abgelehnt, in der Shop API mit HTTP 422 und dem Grund gibberish. Zwischen dem Log-Score (Standard 60) und dem Ablehn-Score wird nichts blockiert, die Absendung wird nur protokolliert.

Jede Absendung ab dem Log-Score, blockiert oder nicht, landet an zwei Stellen, nie mit dem Text:

Die Admin-Liste ist die richtige Stelle zum Nachsehen: Ein Standard-Monolog-Setup für Sylius-Produktion packt seinen Handler in fingers_crossed mit action_level: error und verwirft info- und warning-Einträge, solange in derselben Anfrage kein Fehler auftritt.

mmd:altcha:purge entfernt Einträge, die älter als 30 Tage sind (--gibberish-log-retention=<Sekunden>). Hat ein Host die Migration noch nicht ausgeführt, gehen die Log-Einträge verloren, nicht die Absendungen.

Fehlalarme und Feintuning

Ein Fehlalarm weist einen echten Kunden ab, ein ausbleibender Alarm lässt eine Spam-Nachricht durch. Die Standardwerte sind deshalb vorsichtig, und die Prüfung führst du in zwei Schritten ein:

  1. Einschalten und den Ablehn-Score auf 100 setzen (der höchste einstellbare Wert), damit sie so gut wie nie blockt. Abgelehnt wird ab einem Score größer oder gleich dem Ablehn-Score, und 100 erreichen nur Extremfälle wie ein sehr langer Text aus reinem Tastaturgeklapper.
  2. Das Gibberish-Log eine Weile beobachten und den Ablehn-Score erst senken, wenn das Protokollierte wirklich Spam ist.

Die Gründe im Log sagen, warum: pattern_words ist der Anteil der Buchstaben in Tastaturreihen und Wiederholungen, implausible_letter_sequences der Anteil in Wörtern, die keine Sprachtabelle kennt, letters die Menge an Fließtext, die beurteilt wurde.

Wo das Risiko real ist:

Der Korpus in tests/Fixtures/gibberish/ ist der Abnahmetest: Ergänze eine ehrliche Probe, die vorher zu hoch bewertet wurde, bevor du eine Schwelle oder ein Signal änderst.

Ein Rollout-Beispiel mit konkreten Schritten steht unter Konfiguration.