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.
| 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, nachdem die Locale gesetzt ist und vor der Firewall |
| 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.
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/ # Sechs 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/
config/
├── grids/ # Vier Admin-Grids
├── routes/ # admin.yaml, shop.yaml
└── twig_hooks/ # Hooks für Titelbereich und Aktionen
ChannelSettings, CustomTarget, DisposableDomainOverride, GibberishLogEntry, RateLimitHit und UsedChallenge: sechs Tabellen, sechs Migrationen, je eine pro Entity. Die Tabellen heißen mmd_sylius_altcha_*.
framework.trusted_proxies (und trusted_headers) von Symfony setzen, sonst teilen sich alle Besucher einen Zähler, und ein Ansturm einer einzelnen Person sperrt das Formular für alle.sylius_shop_json_login_check) sendet über eigenes JavaScript und kann keine Lösung mitschicken. Er bekommt deshalb nur ein Rate-Limit (Schutzziel checkout_login), nie eine Proof-of-Work-Prüfung. Das Limit zählt jeden Versuch, auch erfolgreiche, und gilt gemeinsam für alle hinter derselben IPv4-Adresse: Bei Kunden hinter einem Carrier-Grade-NAT oder einer Büro-Adresse das Rate-Limit erhöhen oder das Schutzziel abwählen.X-Altcha-Payload oder Feld altcha).