diff --git a/fp_altcha_spamschutz/src/Handler/ValidationHandler.php b/fp_altcha_spamschutz/src/Handler/ValidationHandler.php index 009855e..ca14612 100644 --- a/fp_altcha_spamschutz/src/Handler/ValidationHandler.php +++ b/fp_altcha_spamschutz/src/Handler/ValidationHandler.php @@ -21,6 +21,12 @@ use Plugin\fp_altcha_spamschutz\src\Service\AltchaService; * wird das POST-Feld "abonnieren" entfernt, sodass JTL-Shop die Anmeldung erst gar nicht verarbeitet. * Der Hook-Handler unten ist eine zusaetzliche Absicherung ("defense in depth"), falls dieser fruehe * Filter aus irgendeinem Grund nicht greift. + * + * Kontaktformular: der dafuer vorgesehene Hook (HOOK_KONTAKT_PAGE_PLAUSI) ist offiziell nicht + * dokumentiert (keine Angaben zu den uebergebenen Parametern). Um sich nicht auf ungeprueftes + * Verhalten zu verlassen, wird hier bewusst derselbe fruehe, hook-unabhaengige Ansatz wie bei der + * Newsletter-Anmeldung verwendet: direkte Pruefung von $_POST, noch bevor JTL-Shop das Formular + * verarbeitet (siehe guardContactSubmission()). */ class ValidationHandler { @@ -98,6 +104,41 @@ class ValidationHandler } } + /** + * Fruehe Pruefung fuer das Kontaktformular. Wird direkt aus Bootstrap::boot() aufgerufen, nach + * demselben Muster wie guardNewsletterSubmission(). Das Formular sendet ein verstecktes Feld + * "kontakt" mit dem Wert "1" mit, das als zuverlaessiges Erkennungsmerkmal dient. + */ + public function guardContactSubmission(): void + { + try { + if (!$this->altchaService->isEnabledForContact()) { + return; + } + + $isContactSubmit = ($_SERVER['REQUEST_METHOD'] ?? '') === 'POST' + && isset($_POST['kontakt']); + + if (!$isContactSubmit) { + return; + } + + if ($this->altchaService->verifyPost()) { + return; + } + + // Pflichtfeld leeren, damit JTL-Shops eigene Pruefung ("Pflichtfeld nicht ausgefuellt") + // die Anfrage abweist -- der Besucher bekommt die normale, vertraute Fehlermeldung. + unset($_POST['nachricht']); + } catch (\Throwable $e) { + // Wird direkt in Bootstrap::boot() aufgerufen (nicht ueber einen Hook) -- ein + // Fehler hier darf auf keinen Fall den kompletten Seitenaufbau verhindern. + if ($this->altchaService->isDebug()) { + error_log('[fp_altcha_spamschutz] Fehler bei Kontakt-Fruehpruefung: ' . $e->getMessage()); + } + } + } + /** * Zusaetzliche Absicherung ueber HOOK_NEWSLETTER_PAGE_EMPFAENGEREINTRAGEN, falls die fruehe * Pruefung in guardNewsletterSubmission() aus irgendeinem Grund nicht gegriffen hat.