Markus Michalski FAQ

ALTCHA: Technische Details

ALTCHA Spam-Schutz für Sylius - Ablauf der Prüfkette als Diagramm, die drei Prüfwege (Formular, Route, Event), Plugin-Struktur und die sechs Entities mit eigenen Tabellen

English Version

Zurück zur Übersicht

ALTCHA: Technische Details

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

Ablauf der Prüfungen

graph TD
    A["Absendung / Request"] --> B{"Channel aktiviert?"}
    B -->|"Nein"| C["Ungeschützt"]
    B -->|"Ja"| D{"Schutzziel angehakt?"}
    D -->|"Nein"| C
    D -->|"Ja"| E["Rate-Limit"]
    E -->|"überschritten"| F["429 / rate_limited"]
    E -->|"ok"| G["Honeypot + Ausfüllzeit"]
    G -->|"fehlgeschlagen"| H["Abgelehnt - Formularfehler / 422"]
    G -->|"ok"| I{"Wegwerf-Mail / Gibberish aktiv?"}
    I -->|"auffällig"| H
    I -->|"aus oder bestanden"| J["ALTCHA-Lösung prüfen"]
    J -->|"ungültig oder bereits verwendet"| H
    J -->|"gültig"| K["Absendung akzeptiert"]

Rate-Limit, Honeypot, Mindest-Ausfüllzeit und die Inhaltsprüfungen laufen vor der Proof-of-Work-Prüfung (die günstigsten zuerst), und zwar bei allen drei Prüfwegen gleich: Ein Schutzziel wird immer auf dieselbe Weise geprüft, egal über welchen Weg es erreicht wird.

Die drei Prüfwege

graph LR
    A["Twig-Formular (Storefront)"] --> D["Formularvalidierung"]
    B["Route (Login / Checkout / Shop API)"] --> E["Routenprüfung bei kernel.request"]
    C["Plugin-Event (Support-Formular, Newsletter)"] --> F["Event-Listener"]
    D --> G["Prüfkette"]
    E --> G
    F --> G
    G --> H["Channel-Einstellungen"]
Prüfweg Verwendet für Läuft
Formularvalidierung Registrierung, Kontakt, "Passwort vergessen", eigene Formulare Nach den regulären Constraints, ein aus anderen Gründen ungültiges Formular verbraucht also keine Challenge. Neuberechnungen einer Live-Component werden übersprungen.
Routenprüfung Login, Login im Checkout, Operationen der Shop API Bei kernel.request, vor der Firewall. Bei Storefront-Routen ist die Locale dann bereits gesetzt; bei API-Routen setzt Sylius sie erst später aus dem Channel, deshalb liest die Prüfung die Locale dort aus dem Locale-Kontext von Sylius.
Event-Listener Support-Formular, Newsletter und jedes Schutzziel, das Events angibt Auf dem eigenen ablehnbaren Event des anderen Plugins (Storefront und API gleichermaßen)

Eine Ablehnung bei der Formularvalidierung wird als Formularfehler hinzugefügt und zusätzlich als Flash-Meldung angezeigt, weil die Sylius-Shop-Templates Felder einzeln rendern und nie die Fehler des Formulars selbst.

Plugin-Struktur

src/
├── Challenge/          # Challenge-Erzeugung und Signatur
├── Command/            # SetupCommand, PurgeCommand, UpdateDisposableDomainsCommand
├── Controller/         # ChallengeController, BlockedDomainsController
├── DependencyInjection/
├── DisposableEmail/    # Wegwerf-Mail-Prüfung, Domain-Liste, Entities für Ausnahmen
├── Enforcement/        # Form-Type-Extension, Route-Listener, Event-Listener und -Registrar
├── Entity/             # ChannelSettings, CustomTarget, DisposableDomainOverride, GibberishLogEntry, RateLimitHit, UsedChallenge
├── Form/Type/          # Formulartypen für den Admin
├── Gibberish/          # Scorer, Trigramm-Tabellen, Build-Script
├── Guard/              # SubmissionGuard (steuert alle Prüfungen), Rejection-Enum
├── Menu/               # Eintrag in der Admin-Sidebar
├── Migrations/         # Sieben Doctrine-Migrationen
├── RateLimit/          # Rate-Limiter
├── Request/
├── Security/           # Secret-Verschlüsselung (libsodium)
├── Settings/           # Provider und Factory für Channel-Einstellungen
├── Submission/
├── Target/             # ProtectionTarget, Registry, eingebaute Schutzziele
├── Twig/               # Funktion mmd_altcha_widget()
├── Validator/
└── Verification/       # Proof-Prüfung und Replay-Schutz
config/
├── grids/              # Vier Admin-Grids
├── routes/             # admin.yaml, shop.yaml
└── twig_hooks/         # admin.yaml (Titelbereich und Aktionen im Admin), shop.yaml (Widget-Hooks der Storefront, u. a. mmd_altcha.widget*)

Entities

ChannelSettings, CustomTarget, DisposableDomainOverride, GibberishLogEntry, RateLimitHit und UsedChallenge: sechs Tabellen mit dem Präfix mmd_sylius_altcha_*. Es gibt sieben Migrationen:

Betriebshinweise