Praxisanleitung

Spamschutz fürs Kontaktformular ohne Captcha

Die meisten Spam-Mails über ein Kontaktformular kommen von einfachen Bots. Unsichtbare Prüfungen stoppen sie, ohne dass echte Besucher Ampeln anklicken.

Die kurze Antwort. Spam im Kontaktformular fangen Sie ohne Captcha ab, wenn Sie unsichtbare Prüfungen stapeln. Ein Honeypot und eine Mindestzeit auf dem Server stoppen einfache Bots. Filter für Links und Wiederholungen fangen den Rest. Cloudflare Turnstile kommt dazu, wenn die Bots schlauer werden. Jede Prüfung gehört auf den Server.

Formgong teamAktualisiert

Kontaktformular-Spamschutz ohne Captcha
Spamschutz fürs Kontaktformular ohne Captcha

Warum ein Captcha nicht der erste Schritt ist

Bilderrätsel kosten echte Nachrichten. Manche Besucher geben auf, manche lösen sie am Handy nicht, und manche Screenreader kommen damit schlecht zurecht. Klassisches reCAPTCHA schickt außerdem Besucherdaten an Google. Das gehört in den Datenschutzhinweis.

Der größte Teil des Kontaktformular-Spams braucht kein Rätsel. Skripte füllen jedes Feld und senden so schnell sie können. Die Schichten unten fangen diese Skripte still ab. Bauen Sie sie der Reihe nach ein und hören Sie auf, wenn der Spam aufhört.

Wer WordPress, Elementor, Joomla oder Contao nutzt, sucht oft nach „kontaktformular spamschutz wordpress“. Für WordPress ohne Plugin steht der Weg in WordPress-Kontaktformular ohne Plugin. Andere CMS bekommen hier keinen eigenen Abschnitt.

1. Ein Honeypot-Feld einbauen

Ein Honeypot ist ein Textfeld, das Menschen nicht sehen, Bots aber ausfüllen. Steht ein Wert darin, kommt die Einsendung von einem Bot. Legen Sie es außerhalb des Bildschirms, nicht nur mit display:none. Manche Bots überspringen Felder, die so versteckt sind.

Drei Details zählen. tabindex="-1" sorgt dafür, dass die Tastatur das Feld nicht erreicht. aria-hidden="true" lässt Screenreader es aus. Und zeigen Sie keinen Fehler, wenn es gefüllt ist: Nehmen Sie die Sendung still an und legen Sie sie weg, damit der Bot nichts lernt.

Der Feldname im Beispiel bleibt botcheck. Formgong erkennt außerdem _honeypot, _gotcha und _honey. Ein gefülltes Feld wird als Spam gespeichert, nicht zugestellt und zählt nicht zum Kontingent. Der Besucher sieht trotzdem die Erfolgsmeldung.

HTML
<!-- Im <form>. Menschen sehen es nicht; einfache Bots füllen es aus. -->
<div aria-hidden="true" style="position:absolute;inset-inline-start:0;top:0;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)">
  <label>Dieses Feld leer lassen <input type="text" name="botcheck" tabindex="-1" autocomplete="off"></label>
</div>

2. Formulare ablehnen, die zu schnell ausgefüllt sind

Ein Mensch braucht mehrere Sekunden für Name und Nachricht. Ein Bot braucht Millisekunden. Speichern Sie den Zeitpunkt, an dem die Seite angezeigt wurde, in einem versteckten Feld. Der Server lehnt Sendungen ab, die zu schnell ankommen. Ein bis drei Sekunden fangen Bots, ohne schnelle Tipper oder Passwortmanager zu treffen.

Die Prüfung bleibt auf dem Server. Ein Bot kann senden, ohne die Seite je geladen zu haben. Eine fehlende oder unsinnige Zeitmarke ist deshalb auch ein Warnzeichen. Bei Formgong gilt: Liegt zwischen dem Feld _ts und dem Absenden weniger als 1,5 Sekunden, zählt die Einsendung als Spam.

Ein verstecktes Zeitfeld
HTML
<input type="hidden" name="_ts" id="form-ts">
<script>
  // Sekunden seit 1970, als die Seite angezeigt wurde. Der Server vergleicht das mit der Sendezeit.
  document.getElementById("form-ts").value = Math.floor(Date.now() / 1000);
</script>

3. Auf dem Server filtern

Bots, die die ersten beiden Schichten schaffen, hinterlassen Spuren im Text. Einfache Serverregeln helfen:

  • Links. Echte Anfragen enthalten selten mehr als drei Links. Mehr als drei zählen als verdächtig.
  • Stoppwörter. Achten Sie auf Wörter, die Ihr Spam wiederholt, etwa SEO-Angebote oder Krypto.
  • Wiederholung. Begrenzen Sie, wie oft ein Absender pro Minute senden darf. Formgong erlaubt 30 Einsendungen pro Minute und Formular und 20 pro Minute und IP-Adresse.
  • Feldregeln. Ein Telefonfeld voller Buchstaben oder ein Name mit einer URL ist kein Mensch.

Lieber eine Punktzahl als eine harte Sperre. Hohe Werte gehören in einen Spam-Ordner, den Sie ansehen können. Ein Fehlalarm darf keinen echten Kunden verlieren.

Für ein eigenes PHP-Kontaktformular gilt dieselbe Regel: Den Honeypot auf dem Server prüfen, nicht nur im Browser. Das Beispiel ist ein Platzhalter. Es versendet keine Mail und ist keine fertige Anwendung.

PHP: Honeypot auf dem Server prüfen
PHP
<?php
// Platzhalter. Den Honeypot auf dem Server prüfen. Ein gefülltes Feld ist ein Bot.
if (!empty($_POST['botcheck'])) {
  header('Location: /danke');
  exit;
}
$started = isset($_POST['_ts']) ? (int) $_POST['_ts'] : 0;
if ($started === 0 || (time() - $started) < 2) {
  header('Location: /danke');
  exit;
}
// Danach Name, E-Mail und Nachricht prüfen und die Mail selbst versenden.

4. Cloudflare Turnstile, wenn Bots sich anpassen

Kommen schlauere Bots durch, ergänzen Sie Cloudflare Turnstile. Es macht kleine Prüfungen im Browser und zeigt meist kein Rätsel. Die Modi heißen Managed, Non-Interactive und Invisible. Der kostenlose Tarif umfasst bis zu 20 Widgets und unbegrenzte Challenges (Stand 03.10.2026). Cloudflare schreibt, Turnstile lese die Formularfelder nicht.

Das Widget setzt ein Token cf-turnstile-response. Ihr Server oder Ihr Formulardienst muss das Token bei Cloudflare prüfen. Ein Widget ohne Prüfung auf dem Server hält niemanden auf. Turnstile ist bei Formgong auf jedem Tarif optional. Sobald Dateien angehängt werden, ist es Pflicht.

Ein Honeypot und die Zeitprüfung verarbeiten keine zusätzlichen personenbezogenen Daten: Sie sehen nur, ob ein unsichtbares Feld gefüllt ist und wie schnell das Formular ankam. Für Turnstile gegenüber reCAPTCHA und hCaptcha steht der Vergleich in Turnstile, reCAPTCHA und hCaptcha. Den Hinweis am Formular und die Muster für die Datenschutzerklärung beschreibt Kontaktformular und DSGVO. Das ist allgemeine Information, keine Rechtsberatung.

Das Turnstile-Widget
HTML
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
<!-- Im <form>. Das Widget setzt das Feld cf-turnstile-response. -->
<div class="cf-turnstile" data-sitekey="YOUR_SITE_KEY"></div>

Was Formulardienste bereits filtern

Wenn Sie einen gehosteten Dienst nutzen, prüfen Sie, was er schon filtert. Oft müssen Sie nichts selbst schreiben:

  • Formgong behandelt ein gefülltes botcheck als Spam und antwortet trotzdem mit Erfolg, damit Bots nichts lernen. Sendungen schneller als 1,5 Sekunden nach _ts zählen als Spam. Mehr als drei Links, Stoppwörter und eine Sperrliste erhöhen die Punktzahl. Turnstile gibt es im Free-Tarif. Ein optionales Skript ergänzt Tippsignale und einen kleinen Proof-of-Work, ohne Cookies. Spam liegt im Spam-Ordner, geht nicht an E-Mail oder Telegram und zählt nicht zum Limit. Im Free-Tarif kommt die E-Mail als tägliche Zusammenfassung am nächsten Morgen um 08:00; Telegram sofort.
  • Netlify Forms filtert jede Einsendung mit Akismet und unterstützt ein Honeypot-Feld sowie reCAPTCHA 2.
  • FormPost nutzt ein verstecktes Feld und optional eine Rechenaufgabe statt reCAPTCHA.
  • Web3Forms hat hCaptcha und einen Honeypot im Free-Tarif. Turnstile und reCAPTCHA brauchen einen bezahlten Tarif. Weitere kostenlose Dienste stehen auf der Seite Web3Forms-Alternativen.

Das HTML-Kontaktformular enthält den Honeypot schon. Die HTML-Dokumentation zeigt, wie Sie Turnstile ergänzen. Die Tarife stehen unter Preise. Einsendungen liegen in Cloudflare D1 mit EU-Jurisdiktion.

Fehler, die Spam reinlassen oder Menschen aussperren

  • Das Honeypot-Feld auf required setzen. Dann scheitert jeder echte Besucher.
  • Eine sichtbare Beschriftung am Honeypot lassen, sodass Screenreader-Nutzer es ausfüllen.
  • Bots einen Fehler zurückgeben. Das verrät, welches Feld sie überspringen sollen.
  • Nur im Browser prüfen. Bots senden direkt an Ihren Endpunkt.
  • Spam ungesehen löschen. Behalten Sie einen Spam-Ordner für ein paar Tage und sehen Sie nach Fehlalarmen.

„Honeypot statt Captcha“ heißt also nicht „nur ein verstecktes Feld“. Die Zeitprüfung und die Serverfilter gehören dazu. Turnstile ist die letzte Schicht, nicht die erste.

Häufig gestellte Fragen

Wie verhindere ich Spam über das Kontaktformular ohne Captcha?

Setzen Sie ein Honeypot-Feld, eine Mindestzeit und Filter auf dem Server. Turnstile ergänzen Sie erst, wenn diese Schichten nicht mehr reichen. Keine dieser Prüfungen zeigt ein Bilderrätsel.

Funktioniert ein Honeypot-Feld 2026 noch?

Ja, gegen die einfachen Bots, die den meisten Kontaktformular-Spam schicken. Allein reicht es gegen gezielte Bots nicht. Kombinieren Sie es mit einer Zeitprüfung, Serverfiltern und bei Bedarf Turnstile.

Ist Cloudflare Turnstile kostenlos?

Ja. Geprüft am 3. Oktober 2026: Der kostenlose Tarif umfasst bis zu 20 Widgets und unbegrenzte Challenges. Jedes Token muss auf dem Server geprüft werden.

Schadet ein Honeypot der Barrierefreiheit?

Nicht, wenn Sie ihn richtig verstecken: außerhalb des Bildschirms, in aria-hidden, mit tabindex -1. Machen Sie ihn nie zum Pflichtfeld.

Was tun bei einem PHP-Kontaktformular?

Prüfen Sie botcheck und _ts in PHP, bevor Sie eine Mail versenden. Ein gefülltes Honeypot beantworten Sie still, ohne Fehlertext. Ein Skript nur im Browser reicht nicht, weil Bots direkt an das Skript senden.

Quellen und Dokumentation

Offizielle Quellen zu dieser Anleitung: Cloudflare Turnstile, Turnstile-Widget-Modi, Turnstile-Tarife, Turnstile serverseitig prüfen, Netlify: Spam-Filter, FormPost. Formgong für HTML, wo die Daten gespeichert werden.

Diesen Artikel als Markdown lesen

Bewerten Sie diesen Leitfaden

Ihre Bewertung

Wir lesen jede Bewertung. Ein Kommentar erscheint hier erst nach unserer Freigabe.

← Zurück zum Blog