| Nächste Überarbeitung | Vorhergehende Überarbeitung |
| jtl-shop:altcha-spamschutz:start [2026/09/21 15:47] – Hauptseite anlegen jf | jtl-shop:altcha-spamschutz:start [2026/09/22 09:43] (aktuell) – Revert auf vorherige Fassung (letzte Ergänzung zurückgenommen) jf |
|---|
| ====== JTL-Shop: ALTCHA Spamschutz (Registrierung & Newsletter) ====== | ====== JTL-Shop: falk_plus ALTCHA Spam- und Botschutz ====== |
| |
| Selbst gehostetes, quelloffenes Spamschutz-Plugin für JTL-Shop 5 auf Basis des ALTCHA Proof-of-Work-Verfahrens (MIT-Lizenz). Schützt Registrierung und Newsletter-Anmeldung vor automatisierten Fake-Anmeldungen, ohne Daten an Dritte weiterzugeben – kein Google reCAPTCHA, kein externer Dienst, keine Cookies. | Selbst gehostetes, quelloffenes Spam- und Botschutz-Plugin für JTL-Shop 5 auf Basis von [[https://altcha.org|ALTCHA]], einem quelloffenen Proof-of-Work-Verfahren (MIT-Lizenz). Schützt Registrierung, Newsletter-Anmeldung und Kontaktformular vor Spam-Bots und automatisierten Fake-Anmeldungen ohne Daten an Dritte weiterzugeben. Bewusst ohne Google reCAPTCHA und ohne Umleitung über Cloudflare oder ähnliche Dienste. |
| |
| Der Plugin-Quellcode wird direkt aus unserem Gitea-Repository synchronisiert (Repo: **JTL-Shop-ALTCHA-Spamschutz**), sodass Änderungen dort immer sofort auch hier im Wiki aktuell sind. | ===== 1. Was macht das Plugin ===== |
| |
| ===== 1. Hintergrund ===== | Das Plugin blendet in den drei genannten Formularen unauffällig eine kleine Sicherheitsprüfung ein. Der Browser des Besuchers löst dabei im Hintergrund eine kurze Rechenaufgabe (Proof-of-Work), bevor das Formular abgeschickt werden kann. Für Menschen ist das kaum spürbar (in der Regel deutlich unter einer Sekunde), für automatisierte Bot-Skripte, die kein JavaScript ausführen oder einfach nur Formularfelder befüllen, stellt es dagegen eine wirksame Hürde dar. |
| |
| Anlass war Redmine-Ticket #1633 (EOS Verlag): Über Wochen liefen massenhaft Fake-Registrierungen und Newsletter-Anmeldungen mit immer demselben Muster auf – "Test"/"Test User"/"Test Test" in Vorname, Nachname, Straße und Ort, aber echte, unterschiedliche Fremd-E-Mail-Adressen. Rate-Limiting und der bereits eingesetzte LilFOOT SpamProtector konnten das Problem nicht lösen: LilFOOTs Wortlisten-Prüfung wirkt ausschließlich auf Kommentar-/Nachrichtenfelder – die weder das Registrierungs- noch das Newsletter-Formular besitzen. Strukturell kann das Plugin dieses Muster also gar nicht erkennen. | Da die gesamte Prüfung selbst gehostet läuft, verlassen keine Besucherdaten den eigenen Server, es gibt keine Weiterleitung an Google oder Cloudflare und keine Cookie- oder Datenschutz-Implikationen durch Drittanbieter-Dienste. |
| |
| ===== 2. Funktionsweise ===== | ===== 2. Hintergrund ===== |
| |
| Registrierung (''/Registrieren'') und Newsletter-Anmeldung (''/Newsletter'') erhalten eine unsichtbare Sicherheitsprüfung nach dem ALTCHA-Prinzip: Proof-of-Work, selbst gehostet, MIT-Lizenz. Der Browser des Besuchers muss vor dem Absenden eine kleine Rechenaufgabe lösen (meist unter 1 Sekunde, läuft im Hintergrund, kein Klicken/Kästchen nötig). Ein Skript, das das Formular direkt per HTTP-POST anspringt – wie bei den ursprünglichen Fake-Registrierungen offenbar geschehen – hat diese Lösung nicht und wird serverseitig abgelehnt. | Anlass war ein Bot-Problem: über einen längeren Zeitraum liefen massenhaft Fake-Registrierungen und Newsletter-Anmeldungen mit immer demselben Muster auf ("Test"/"Test User" in Vorname/Nachname/Ort/Straße, aber echte, unterschiedliche Fremd-E-Mail-Adressen). Andere getestete Maßnahmen wie Rate-Limiting konnten das Problem nicht zuverlässig lösen, da deren Prüfungen an anderer Stelle ansetzen (z. B. an Kommentar- oder Nachrichtenfeldern, die weder das Registrierungs- noch das Newsletter-Formular besitzen). |
| |
| Ergänzt (ersetzt nicht) das laufende Rate-Limit und LilFOOT SpamProtector. | Dieses Plugin prüft stattdessen direkt beim Absenden von Registrierung, Newsletter-Anmeldung und Kontaktformular selbst, unabhängig davon, welche Felder das jeweilige Formular sonst enthält. Mittlerweile schützt es alle drei Formulare nach demselben Prinzip. |
| |
| ===== 3. Installation ===== | ===== 3. Funktionsweise (ALTCHA) ===== |
| |
| - Im Adminbereich unter *Plugins → Plugin-Verwaltung* prüfen, ob eine "Plugin hochladen"-Funktion für ZIP-Dateien existiert. Falls ja: Plugin-ZIP direkt dort hochladen und installieren. | [[https://altcha.org|ALTCHA]] ist ein quelloffenes, selbst hostbares Proof-of-Work-Verfahren als datenschutzfreundliche Alternative zu klassischen Captchas. Der Ablauf: |
| - Falls nicht: ZIP entpacken, Ordner ''fp_altcha_spamschutz'' per FTP/Dateimanager in das Plugin-Verzeichnis des Shops legen (''.../plugins/fp_altcha_spamschutz/''), danach in *Plugins → Plugin-Verwaltung* auf "Neue Plugins suchen" klicken. | |
| - Plugin öffnen → Einstellungen → Feld **HMAC-Geheimschlüssel** mit einem zufälligen, einmaligen Wert füllen (z. B. per ''openssl rand -hex 32'' erzeugt) und danach nicht mehr ändern, solange das Plugin aktiv genutzt wird. | |
| - Übrige Einstellungen können auf den Standardwerten bleiben (Sicherheitsstufe "Mittel", beide Formulare aktiv, Debug-Logging aus). | |
| - Speichern. | |
| |
| ===== 4. Einstellungen ===== | - Der Server erzeugt beim Laden der Seite eine zufällige Rechenaufgabe (Challenge) und signiert sie. |
| | - Der Browser des Besuchers löst diese Aufgabe im Hintergrund per JavaScript, bevor das Formular abgeschickt werden kann. |
| | - Beim Absenden prüft der Server die eingereichte Lösung anhand der Signatur. Passt sie nicht oder fehlt sie, wird die Anfrage abgelehnt. |
| |
| ^ Einstellung ^ Bedeutung ^ | Die Bibliothek und das Verfahren stehen unter der MIT-Lizenz und werden unverändert vom offiziellen Projekt übernommen (siehe [[https://github.com/altcha-org/altcha-lib-php|altcha-org/altcha-lib-php]] auf GitHub). Es findet keine Kommunikation mit externen Diensten statt, die gesamte Prüfung läuft auf dem eigenen Server. |
| | HMAC-Geheimschlüssel | Signiert die Sicherheitsprüfung. Pro Shop-Installation einmalig erzeugen, danach nicht mehr ändern. | | |
| | Sicherheitsstufe (Rechenaufwand) | Niedrig/Mittel/Hoch – wie viel Rechenarbeit der Browser leisten muss, i. d. R. unter 1 Sekunde. | | |
| | Gültigkeit der Prüfung | Wie lange eine erzeugte Prüfung gültig bleibt (Standard 600 Sekunden). | | |
| | Kundenregistrierung / Newsletter-Anmeldung schützen | Formulare einzeln aktivierbar. | | |
| | Debug-Logging | Schreibt Diagnoseinformationen ins Shop-Errorlog, nur temporär zum Testen aktivieren. | | |
| |
| ===== 5. Pflicht-Test vor Produktivbetrieb ===== | ===== 4. Geschützte Formulare ===== |
| |
| Dieses Plugin greift aktiv in Registrierung und Newsletter-Anmeldung ein. Die Kern-Sicherheitsprüfung (Challenge erzeugen → lösen → verifizieren) wurde isoliert erfolgreich getestet, die Einbindung in JTL-Shop selbst basiert mangels Zugriff auf den JTL-Shop-Quellcode auf der offiziellen Hook-Dokumentation und echtem, öffentlichem Code vergleichbarer JTL-5-Plugins (u. a. Endereco Adressprüfung). Deshalb vor jedem Produktiveinsatz auf einem Testsystem prüfen: | * Kundenregistrierung (''/Registrieren'') |
| | * Newsletter-Anmeldung (''/Newsletter'') |
| | * Kontaktformular (''/Kontakt'') |
| |
| - **Normale Registrierung:** Formular ausfüllen und absenden, muss wie gewohnt funktionieren (kurzes "Sicherheitsprüfung wird vorbereitet …" / "… bestätigt"). | Jedes der drei Formulare lässt sich in den Plugin-Einstellungen einzeln aktivieren oder deaktivieren. |
| - **Normale Newsletter-Anmeldung:** muss wie gewohnt funktionieren. | |
| - **Bypass-Versuch (wichtigster Test):** In der Entwicklerkonsole ''document.querySelector('input[name=altcha]').remove()'' ausführen und absenden – muss mit Fehlermeldung abgelehnt werden. | |
| - **Direkter POST ohne JavaScript** (z. B. curl/Postman) ohne gültiges ''altcha''-Feld – muss ebenfalls abgelehnt werden. | |
| - Einige Tage laufen lassen und die echten Fake-Registrierungszahlen beobachten, bevor produktiv übernommen wird. | |
| - Danach kurz Debug-Logging aktivieren, ein paar Testanmeldungen durchführen, im Shop-Fehlerprotokoll auf ''[fp_altcha_spamschutz]''-Einträge prüfen, anschließend wieder deaktivieren. | |
| |
| ===== 6. Technischer Hintergrund ===== | ===== 5. Installation / Download ===== |
| |
| ==== 6.1 Warum ALTCHA V1 statt des aktuellen Widgets (v3)? ==== | Das Plugin wird als ZIP-Datei über das JTL-Shop-Backend installiert (*Plugins → Plugin hochladen*). |
| |
| Das offizielle ALTCHA-JS-Widget v3 nutzt ein neueres, komplexeres Protokoll (PBKDF2/Argon2id/Scrypt mit Key-Prefix-Matching), für das es keine robust dokumentierte "Challenge direkt einbetten"-Variante ohne zusätzlichen Netzwerk-Endpunkt gibt. Das klassische V1-Protokoll (SHA-256 Hashcash: Client sucht per Brute-Force eine Zahl n, für die SHA256(salt+n) == challenge gilt) ist dagegen vollständig dokumentiert, einfach zu prüfen und wird hier zusammen mit einem kleinen eigenen JS-Löser eingesetzt. Serverseitig kommt der offizielle, unveränderte [[https://github.com/altcha-org/altcha-lib-php|altcha-org/altcha-lib-php]]-Code zum Einsatz (MIT-Lizenz). | Nach dem Hochladen wird das Plugin wie gewohnt im JTL-Shop-Backend aktiviert. Ein HMAC-Geheimschlüssel muss nicht manuell hinterlegt werden, das Plugin erzeugt beim ersten Aufruf automatisch einen zufälligen Schlüssel und speichert ihn im Plugin-Verzeichnis. |
| |
| Die Kryptografie wurde Cross-Language getestet: Der echte, unveränderte ''fp-altcha.js'' wurde unter Node.js gegen eine von der echten PHP-Bibliothek erzeugte Challenge gelöst und das Ergebnis erfolgreich mit derselben PHP-Bibliothek verifiziert. | Repository: [[https://vw.falk.plus/JensFalk/JTL-Shop-ALTCHA-Spamschutz|vw.falk.plus/JensFalk/JTL-Shop-ALTCHA-Spamschutz]] |
| |
| ==== 6.2 Verwendete JTL-Shop-Hooks ==== | ===== 6. Einstellungen ===== |
| |
| ^ Hook ^ Zweck ^ | In den Plugin-Einstellungen im JTL-Shop-Backend lassen sich konfigurieren: |
| | HOOK_SMARTY_OUTPUTFILTER | Fügt Widget-Container und Skript in das gerenderte HTML von Registrierungs- und Newsletter-Formular ein (phpQuery-DOM-Filter). | | |
| | HOOK_REGISTRIEREN_PAGE_REGISTRIEREN_PLAUSI | Plausibilitätsprüfung nach Absenden des Registrierungsformulars. | | |
| | HOOK_NEWSLETTER_PAGE_EMPFAENGEREINTRAGEN | Zusätzliche Absicherung kurz vor dem Speichern des Newsletter-Empfängers (defense in depth). | | |
| |
| Registriert per EventDispatcher in ''Bootstrap.php'' (moderner Mechanismus), nicht über die veraltete XML-''<Hooks>''-Datei. | * **HMAC-Geheimschlüssel** -- optional, wird sonst automatisch erzeugt. |
| | * **Sicherheitsstufe (Rechenaufwand)** -- wie viel Rechenarbeit der Browser vor dem Absenden leisten muss (niedrig/mittel/hoch). |
| | * **Gültigkeit der Prüfung** -- wie lange eine erzeugte Prüfung gültig bleibt, bevor sie abläuft. |
| | * **Formulare** -- Registrierung, Newsletter-Anmeldung und Kontaktformular einzeln aktivierbar. |
| | * **Debug-Logging** -- schreibt zusätzliche Diagnoseinformationen ins Error-Log. |
| |
| ==== 6.3 Defensives Design (fail-open) ==== | ===== 7. Test nach der Installation ===== |
| |
| Jede Stelle, an der sich das Plugin in den Shop einklinkt, ist mit try/catch abgesichert. Bewusste Entscheidung: Schlägt eine Prüfung aus unerwartetem Grund fehl (z. B. Plugin nicht vollständig konfiguriert), wird die Aktion durchgelassen statt den gesamten Shop lahmzulegen. Ein Bot mehr ist besser als ein Shop, bei dem sich niemand mehr registrieren kann. Die eigentliche Sicherheitsprüfung (''AltchaService::verifyPost()'') lehnt dagegen bei fehlender Konfiguration sicherheitshalber ab (fail-closed) – die beiden Ebenen ergänzen sich. | Nach der Installation sollte einmal geprüft werden, dass: |
| |
| ===== 7. Bekannte Einschränkung ===== | * in Registrierung, Newsletter-Anmeldung und Kontaktformular die Sicherheitsprüfung sichtbar erscheint und nach kurzer Zeit "Sicherheitsprüfung bestanden" anzeigt, |
| | * eine normale, korrekt ausgefüllte Anfrage in allen drei Formularen anstandslos durchgeht, |
| | * ein Absenden ohne JavaScript bzw. ohne gelöste Prüfung zuverlässig abgelehnt wird. |
| |
| Falls das Registrierungs- oder Newsletterformular im verwendeten Template abweichende CSS-Klassen/Feldnamen hat als im Template "NOVA" ermittelt (''form.register-form'' bzw. ein Formular mit ''input[name="abonnieren"]''), erscheint das Widget dort nicht – der Shop bleibt aber unverändert nutzbar (kein Fehler, das Plugin erkennt das Formular einfach nicht). In dem Fall bitte über den Issue-Tracker melden (siehe unten), dann werden die Selektoren angepasst. | ===== 8. Bekannte Einschränkungen ===== |
| |
| ==== 8. Fehlerbehebung ==== | Das Widget wird über das umgebende Formular-Element eingebunden. Bei stark individualisierten Theme-Anpassungen, die die Formularstruktur wesentlich verändern, kann es in seltenen Fällen nötig sein, die verwendeten CSS-Selektoren im Plugin anzupassen. |
| |
| ^ Problem ^ Ursache ^ Lösung ^ | ===== 9. Weiterführende Links ===== |
| | Widget erscheint nicht | Formular-Selektoren passen nicht zum Template | Siehe Abschnitt 7, Issue öffnen | | |
| | Registrierung/Newsletter immer abgelehnt | Kein oder falscher HMAC-Geheimschlüssel hinterlegt | Einstellungen prüfen, Schlüssel neu setzen | | |
| | Keine Fehlermeldung, Formular tut einfach nichts | JavaScript blockiert/sehr alter Browser ohne Web Crypto API | Erwartetes, sicheres Verhalten – Prüfung kann dann nicht bestätigt werden | | |
| |
| ===== 9. Quellcode ===== | * Gitea-Repository (Quellcode, Releases, Issues): [[https://vw.falk.plus/JensFalk/JTL-Shop-ALTCHA-Spamschutz]] |
| | * ALTCHA-Projekt: [[https://altcha.org]] |
| Wird als reguläre Plugin-Dateien im Shop-Plugin-Verzeichnis abgelegt (siehe Installation). Die vendorierte ALTCHA-PHP-Bibliothek (''src/Vendor/AltchaOrg/Altcha/V1/'', MIT-Lizenz) ist Teil der Plugin-ZIP, wird hier aber nicht dupliziert – siehe [[https://github.com/altcha-org/altcha-lib-php|altcha-org/altcha-lib-php]]. | * ALTCHA PHP-Bibliothek (MIT-Lizenz): [[https://github.com/altcha-org/altcha-lib-php]] |
| | |
| ==== 9.1 info.xml (Plugin-Manifest & Einstellungen) ==== | |
| | |
| {{page>gitea_code:JTL-Shop-ALTCHA-Spamschutz:info_xml}} | |
| | |
| === 💬 Fragen & Feedback === | |
| Haben Sie Fehler gefunden, Verbesserungsvorschläge oder Fragen zu dieser Datei? | |
| [[https://vw.falk.plus/JensFalk/JTL-Shop-ALTCHA-Spamschutz/issues/new?labels=info.xml|Hier ein neues Gitea-Issue öffnen]] | |
| | |
| ==== 9.2 Bootstrap.php (Hook-Registrierung) ==== | |
| | |
| {{page>gitea_code:JTL-Shop-ALTCHA-Spamschutz:bootstrap_php}} | |
| | |
| === 💬 Fragen & Feedback === | |
| Haben Sie Fehler gefunden, Verbesserungsvorschläge oder Fragen zu dieser Datei? | |
| [[https://vw.falk.plus/JensFalk/JTL-Shop-ALTCHA-Spamschutz/issues/new?labels=Bootstrap.php|Hier ein neues Gitea-Issue öffnen]] | |
| | |
| ==== 9.3 AltchaService.php (Challenge & Verifikation) ==== | |
| | |
| {{page>gitea_code:JTL-Shop-ALTCHA-Spamschutz:altchaservice_php}} | |
| | |
| === 💬 Fragen & Feedback === | |
| Haben Sie Fehler gefunden, Verbesserungsvorschläge oder Fragen zu dieser Datei? | |
| [[https://vw.falk.plus/JensFalk/JTL-Shop-ALTCHA-Spamschutz/issues/new?labels=AltchaService.php|Hier ein neues Gitea-Issue öffnen]] | |
| | |
| ==== 9.4 TemplateHandler.php (Widget-Einbindung) ==== | |
| | |
| {{page>gitea_code:JTL-Shop-ALTCHA-Spamschutz:templatehandler_php}} | |
| | |
| === 💬 Fragen & Feedback === | |
| Haben Sie Fehler gefunden, Verbesserungsvorschläge oder Fragen zu dieser Datei? | |
| [[https://vw.falk.plus/JensFalk/JTL-Shop-ALTCHA-Spamschutz/issues/new?labels=TemplateHandler.php|Hier ein neues Gitea-Issue öffnen]] | |
| | |
| ==== 9.5 ValidationHandler.php (Prüfung bei Absenden) ==== | |
| | |
| {{page>gitea_code:JTL-Shop-ALTCHA-Spamschutz:validationhandler_php}} | |
| | |
| === 💬 Fragen & Feedback === | |
| Haben Sie Fehler gefunden, Verbesserungsvorschläge oder Fragen zu dieser Datei? | |
| [[https://vw.falk.plus/JensFalk/JTL-Shop-ALTCHA-Spamschutz/issues/new?labels=ValidationHandler.php|Hier ein neues Gitea-Issue öffnen]] | |
| | |
| ==== 9.6 fp-altcha.js (Client-seitiger Löser) ==== | |
| | |
| {{page>gitea_code:JTL-Shop-ALTCHA-Spamschutz:fp-altcha_js}} | |
| | |
| === 💬 Fragen & Feedback === | |
| Haben Sie Fehler gefunden, Verbesserungsvorschläge oder Fragen zu dieser Datei? | |
| [[https://vw.falk.plus/JensFalk/JTL-Shop-ALTCHA-Spamschutz/issues/new?labels=fp-altcha.js|Hier ein neues Gitea-Issue öffnen]] | |
| | |
| ---- | |
| | |
| //Anleitung erstellt auf Basis der Umsetzung für EOS Verlag (Redmine-Ticket #1633). Plugin-Quellcode wird live aus Gitea (Repo: JTL-Shop-ALTCHA-Spamschutz) synchronisiert// | |
| |