Zweck
Blockiert typische Bot-Anfragen direkt auf Serverebene, bevor:
- Elementor speichert
- eine Mail versendet wird
- eine Erfolgsmeldung angezeigt wird
Der Schutz greift auf admin-ajax.php und ist:
- unabhängig von Theme
- unabhängig von JavaScript
- unabhängig von Sessions
- DSGVO-neutral
- hosting-unabhängig
Technische Funktionsweise
Der Code hängt sich früh in admin_init ein und prüft:
- Handelt es sich um ein Elementor-Formular?
- Existiert ein gültiger Referrer?
- Existiert ein User-Agent?
- Enthalten relevante Felder typische Spam-Muster?
Wenn eine Prüfung fehlschlägt → HTTP 403 → Abbruch.
Abgedeckte Spam-Muster
Blockiert u. a.:
- Random-Strings wie asdjklqwex
- Lange Zeichenketten ohne Vokale
- Sehr kurze Pseudo-Nachrichten
- POST-Requests ohne Referrer
- POST-Requests ohne User-Agent
Der Spam-Guard prüft ausschließlich semantische Freitextfelder (Name, Betreff, Nachricht etc.).
Systemfelder, E-Mail, Telefonnummern, Tokens oder Security-Parameter werden bewusst nicht geprüft.
Einsatzbereich
Aktuell greift der Schutz bei:
action = elementor_pro_forms_send_form
Für andere Form-Plugins muss die jeweilige action ergänzt werden.
Einbau
Plugin: Code Snippets
Ausführung: Überall
Priorität: unverändert (Code enthält Priority 1)
<?php
/**
* image² – Standard Formular Spam Guard
* Prüft nur semantische Freitextfelder.
* Builder-unabhängig (Elementor Pro + klassische POST-Formulare).
*/
add_action('admin_init', function () {
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
return;
}
// Relevante Freitextfelder (Whitelist)
$fields_to_check = [
'name',
'first_name',
'last_name',
'betreff',
'subject',
'message',
'firma',
'company'
];
/*
* ==============================
* 1️ Elementor Pro (form_fields[])
* ==============================
*/
if (!empty($_POST['form_fields']) && is_array($_POST['form_fields'])) {
foreach ($_POST['form_fields'] as $field_key => $value) {
if (!in_array($field_key, $fields_to_check, true)) {
continue;
}
$value = trim((string) $value);
if ($value === '') {
continue;
}
// Mindestlänge für Nachricht
if ($field_key === 'message' && strlen($value) < 6) {
wp_die('', '', ['response' => 403]);
}
// Kauderwelsch: lange Zeichenkette ohne Leerzeichen
if (strlen($value) >= 12 && strpos($value, ' ') === false) {
wp_die('', '', ['response' => 403]);
}
}
}
/*
* ==============================
* 2️ Klassische POST-Formulare
* ==============================
*/
foreach ($fields_to_check as $field) {
if (!isset($_POST[$field])) {
continue;
}
$value = trim((string) $_POST[$field]);
if ($value === '') {
continue;
}
if ($field === 'message' && strlen($value) < 6) {
wp_die('', '', ['response' => 403]);
}
if (strlen($value) >= 12 && strpos($value, ' ') === false) {
wp_die('', '', ['response' => 403]);
}
}
}, 1);