Serverseitiger Spam-Schutz für Elementor Pro Forms

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:

  1. Handelt es sich um ein Elementor-Formular?
  2. Existiert ein gültiger Referrer?
  3. Existiert ein User-Agent?
  4. 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);