Webdesign lernen WordPress · Sicherheit

Contact Form 7 mit SPAM-Botschutz.

Ein Contact-Form-7-Formular mit drei SPAM-Schutzmethoden – unsichtbare Checkbox, sichtbare Bot-Falle und Time Trap – inklusive serverseitiger Prüfung in der functions.php.

Contact Form 7 mit SPAM-Botschutz

Dieses Beispiel zeigt ein Contact Form 7 Formular mit drei verschiedenen SPAM-Schutzmethoden:

  • Unsichtbare Checkbox („subscribe“): Versteckte Checkbox, die Bots oft ankreuzen.
  • Sichtbare Checkbox („bot-trick“): Checkbox mit auffälligem Label „Ich bin ein Bot…“ – echte Nutzer lassen sie frei, Bots kreuzen oft an.
  • Time Trap: Formular muss mindestens 5 Sekunden geöffnet sein, bevor es abgesendet werden kann.

Der Vorteil: Du brauchst kein Captcha und keine externen Dienste wie Google reCAPTCHA – deine Besucher werden nicht genervt und es fließen keine Daten an Dritte.

Contact Form 7 Formular Code

Diese Felder kannst du direkt in deinen Contact Form 7 Editor kopieren:

text
[text* your-name placeholder "Kontaktperson*"]
[email* your-email placeholder "E-Mail*"][honeypot mail]
[textarea* your-message placeholder "Nachricht ...*"]
[checkbox bot-trick use_label_element "Ich bin ein Bot und will dich ärgern"]
[checkbox subscribe default:off "Ja, ich möchte den Newsletter erhalten"]
[acceptance Datenschutz]
Ich habe die Datenschutzerklärung gelesen und akzeptiert.
[/acceptance]
[submit id:submit-btn "Senden"]
[hidden time-start id:time-start]

Der Tag [honeypot mail] stammt aus dem kostenlosen Zusatz-Plugin „Honeypot for Contact Form 7“ und ergänzt eine weitere unsichtbare Falle.

Mit Bootstrap:

html
<div class="row form-group">
  <div class="col-md-6">
    [text* your-name placeholder "Kontaktperson*"]
  </div>
  <div class="col-md-6">
    [email* your-email placeholder "E-Mail*"]
    [honeypot mail]
  </div>
  <div class="col-md-12">
    [textarea* your-message placeholder "Nachricht ...*"]
  </div>
  <div class="col-lg-12">
    [checkbox bot-trick use_label_element "Ich bin ein Bot und will dich ärgern"]
  </div>
  <div class="col-lg-12 checkbox">
    [checkbox subscribe default:off "Ja, ich möchte den Newsletter erhalten"]
  </div>
  <div class="col-lg-12">
    [acceptance Datenschutz]
      <small>Ich habe die <a href="/datenschutz">Datenschutzerklärung</a> gelesen und akzeptiert.</small>
    [/acceptance]
    [submit id:submit-btn "Senden"]
    [hidden time-start id:time-start]
  </div>
</div>

Die Klasse checkbox verbirgt die „subscribe“-Checkbox per CSS vor normalen Nutzern:

css
.wpcf7 .checkbox {
  display: none;
}

JavaScript: Startzeit für die Time Trap setzen

Damit die Time Trap funktioniert, muss das versteckte Feld time-start beim Laden der Seite die aktuelle Zeit bekommen. Das erledigt dieses kleine Skript (z.B. im Footer oder per wp_enqueue_script):

html
<script>
document.addEventListener('DOMContentLoaded', function () {
  var field = document.getElementById('time-start');
  if (field) {
    field.value = Date.now();
  }
});
</script>

functions.php: PHP-Validierung für SPAM-Schutz

Füge diesen Code in die functions.php deines Themes ein (am besten in einem Child Theme), um die Felder serverseitig zu prüfen:

php
<?php
// Unsichtbare Checkbox und sichtbare Bot-Falle validieren
add_filter('wpcf7_validate_checkbox', function($result, $tag) {
    $name = $tag->name;
    // Versteckte Checkbox (Honeypot)
    if ($name === 'subscribe') {
        $value = isset($_POST['subscribe']) ? $_POST['subscribe'] : array();
        if (!empty($value)) {
            $result->invalidate($tag, "Formular wurde blockiert. Bitte verlasse meine Seite!");
        }
    }
    // Sichtbare "Ich bin ein Bot"-Checkbox
    if ($name === 'bot-trick') {
        $value = isset($_POST['bot-trick']) ? $_POST['bot-trick'] : array();
        if (!empty($value)) {
            $result->invalidate($tag, "Formular wurde blockiert. Bitte verlasse meine Seite!");
        }
    }
    return $result;
}, 10, 2);
// Time Trap Validierung: Mindestzeit 5 Sekunden für Absenden
add_filter('wpcf7_validate_hidden', function($result, $tag) {
    if ($tag->name === 'time-start') {
        $timeStart = intval($_POST['time-start']);
        $now = round(microtime(true) * 1000);
        // Mindestens 5 Sekunden (5000 ms) vergehen lassen
        if (($now - $timeStart) < 5000) {
            $result->invalidate($tag, "Du hast das Formular zu schnell ausgefüllt. Bitte warte mindestens 5 Sekunden.");
        }
    }
    return $result;
}, 10, 2);

Wie funktioniert der SPAM-Botschutz?

Spambots reagieren unterschiedlich auf die Felder:

  1. Feld-Analyse: Bots lesen das HTML und erkennen Eingabefelder, weisen ihnen automatisch Werte zu.
  2. Heuristiken & Blacklisting: Manche Bots ignorieren Felder mit verdächtigen Namen wie „bot“ oder „spam“.
  3. Logikbasiertes Ausfüllen: Manche Bots füllen nur offensichtlich notwendige Felder, lassen verborgene oder „funktionale“ aus.
  4. Maschinelles Lernen: Sehr fortgeschrittene Bots nutzen KI, um sinnvolle Eingaben automatisch zu erkennen und auszufüllen.

Das „subscribe“-Feld trägt einen neutralen Namen und ist komplett versteckt (CSS display:none), daher erkennen viele Bots es nicht direkt als Falle, füllen es jedoch dennoch aus, was zum Block führt.

Die sichtbare Checkbox bot-trick („Ich bin ein Bot…“) ist eine Falle für weniger clevere Bots, die automatisch alles ankreuzen – echte Nutzer ignorieren dieses Feld.

Mit dem Time Trap wird verhindert, dass das Formular innerhalb weniger Sekunden abgesendet wird – typische Bots sind sehr schnell, echte Nutzer brauchen länger.

Zusammenfassung und Tipps

  • Verstecke Fallen-Felder mit neutralen Namen per CSS, damit sie von echten Nutzern nicht gesehen werden.
  • Verwende sichtbare „Bot-Trick“-Felder mit klaren Labels, die echte Nutzer anleiten, sie nicht anzukreuzen.
  • Füge serverseitige Validierungen hinzu, um Manipulation zu verhindern.
  • Nutze eine Time Trap, um Bot-Attacken durch sehr schnelle Absendungen zu unterbinden.
  • Testen: Formulare helfen nur, wenn sie gut umgesetzt sind. Teste mit echten Nutzern und gängigen Bots.

P.S.: Pflichtfeld für Rechtliches mit [acceptance]

DSGVO-konforme Zustimmung

So setzt du mit dem Contact Form 7 Tag [acceptance] Pflichtfelder für Datenschutz, AGB & Co. – inkl. serverseitiger Validierung via acceptance_as_validation.

html
<!-- Akzeptanzfeld mit Contact Form 7 -->
<label>
  [acceptance Datenschutz]
  Ich habe die <a href="/datenschutz">Datenschutzerklärung</a> gelesen und akzeptiert.
</label>
<!-- Alternativ mit benanntem Tag (z.B. AGB) -->
<label>
  [acceptance AGB]
  Ich akzeptiere die <a href="/agb">AGB</a>.
</label>

Wichtig: Damit das Akzeptieren auch als Pflichtfeld wirkt, muss in den Zusätzlichen Einstellungen des Kontaktformulars folgendes gesetzt werden:

text
acceptance_as_validation: on

Dadurch validiert Contact Form 7 serverseitig, ob das Acceptance-Feld vom Nutzer aktiv bestätigt wurde – sonst kann das Formular nicht abgesendet werden.

Dieses Vorgehen ist ideal, um rechtliche Zustimmungen (Datenschutzerklärung, AGB, Einwilligung zur Datenverarbeitung) nachvollziehbar zu dokumentieren.

Weiterlernen

Den PHP-Code legst du am besten in einem WordPress Child Theme ab, damit er Updates übersteht. Passend dazu: ein selbst erstelltes Cookie Banner ohne externe Dienste und gut lesbare Kommentare im PHP-Code. Wer HTML-Code in Beiträgen zeigen will, wandelt ihn mit dem HTML Escape Generator um.

Dein Formular wird trotzdem zugespammt? Ich kümmere mich um die WordPress-Programmierung und die laufende Betreuung deiner Webseite.

FAQ: Spam-Schutz

Contact Form 7 ohne Captcha absichern

Wie schütze ich Contact Form 7 ohne Captcha vor Spam?

Mit unsichtbaren Fallen-Feldern (Honeypot), einer sichtbaren Bot-Checkbox und einer Time Trap, die zu schnelles Absenden blockiert. Alle drei Methoden werden serverseitig in der functions.php geprüft und kommen ganz ohne Captcha oder externe Dienste aus.

Was ist ein Honeypot-Feld?

Ein Honeypot ist ein Formularfeld, das für Menschen unsichtbar ist. Bots füllen es trotzdem aus, weil sie alle Felder im HTML erkennen. Ist das Feld beim Absenden gefüllt, wird die Nachricht blockiert.

Funktioniert die Time Trap auch, wenn JavaScript deaktiviert ist?

Ohne JavaScript bleibt das Feld time-start leer. intval() macht daraus 0, die berechnete Zeitspanne ist dann riesig und die Time Trap greift nicht – die Nachricht geht trotzdem durch, die beiden Checkbox-Fallen schützen aber weiter. Willst du auch das abfangen, lehne in der PHP-Prüfung zusätzlich leere Werte ab.

Ersetzt das den Spam-Schutz durch Akismet oder reCAPTCHA?

Für die meisten Webseiten reichen die drei Fallen völlig aus. Bei sehr hohem Spam-Aufkommen kannst du sie mit Akismet kombinieren. reCAPTCHA brauchst du damit in der Regel nicht – das ist auch aus Datenschutzsicht ein Vorteil.

Ist die Checkbox „Ich bin ein Bot“ nicht verwirrend für Besucher?

Das Label ist bewusst eindeutig formuliert, sodass echte Besucher es nicht anklicken. Wer sie versehentlich ankreuzt, erhält eine Fehlermeldung und kann das Häkchen wieder entfernen.

Passt dazu Weitere Tutorials

Weiter lernen.

Keine Zeit, es selbst umzusetzen? Ich baue Ihre Webseite schnell und sauber.

Jetzt kontaktieren