Kontaktformular-Schutz hinzugefuegt (v1.1.0)

This commit is contained in:
2026-09-21 19:26:25 +02:00
parent 0c1b139744
commit 87b948d924
@@ -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.