Formular Script

Spamschutz im Kontaktformular ohne Google reCAPTCHA


Ein Spamschutz im Kontaktformular muss nicht von Google kommen. reCAPTCHA lädt ein Script von Google-Servern, und Captchas mit Bilderrätseln kosten Ihre Besucher Zeit oder sperren manche Menschen ganz aus. Gegen einfache Spam-Bots helfen auch drei Prüfungen, die nur auf Ihrem eigenen Server laufen: ein CSRF-Token, ein verstecktes Honeypot-Feld und eine Zeitprüfung. Hier finden Sie die drei Methoden mit Codebeispielen, einen Vergleich mit Captcha, Wortfilter und reCAPTCHA und die Grenzen aller Verfahren.

Wie Spam ins Kontaktformular kommt


Was ein Spamschutz im Kontaktformular leisten muss, hängt davon ab, wer das Formular missbraucht. Ein ungeschütztes Formular ist für Spammer eine Werbefläche, für die sie nichts bezahlen. Programme, sogenannte Spambots, füllen Formulare automatisch mit Werbetext und Links und schicken sie in großer Zahl ab.

Die einfachsten Spambots senden ihre Daten direkt an die Adresse aus dem action-Attribut, ohne die Seite zu laden. Andere rufen die Seite auf und füllen jedes Feld, das sie im HTML finden. Aufwendigere Bots steuern einen echten Browser. Und manche Werbung tippt ein Mensch von Hand ein.

Dazu kommt ein zweiter Missbrauch. Schickt das Formular dem Absender eine Bestätigung, kann ein Spammer eine fremde Adresse eintragen und Werbung in das Namensfeld schreiben. Die Bestätigungsmail trägt sie dann von Ihrem Server aus zu Menschen, die das Formular nie benutzt haben.

Die Klassiker: Captcha und Wortfilter


Zwei Verfahren für den Spamschutz im Kontaktformular gibt es seit vielen Jahren. Das Captcha stellt dem Absender eine Aufgabe, der Wortfilter prüft den Text.

Wie ein Captcha funktioniert

Ein Captcha soll eine Aufgabe stellen, die Menschen leichtfällt und Computern schwer. Die klassische Form ist ein Bild mit zufälligen Buchstaben und Zahlen, verzerrt und mit Mustern im Hintergrund verfremdet. Erst wer die Zeichen richtig abtippt, kann absenden. Wie sich ein Bild-Captcha mit Perl einbauen lässt, beschreibt die Anleitung Captcha mit Perl auf cgi-webspace.de.

Was Captchas Ihre Besucher kosten

Jedes Captcha verlagert Arbeit vom Betreiber auf den Besucher. Je stärker die Zeichen verfremdet sind, desto eher braucht man einen zweiten Versuch. Luis von Ahn von der Carnegie Mellon University rechnete 2007 mit 60 Millionen oder mehr gelösten Captchas am Tag zu je etwa zehn Sekunden, zusammen mehr als 150.000 Stunden täglich. Cloudflare kam 2021 nach eigenen Daten auf durchschnittlich 32 Sekunden pro Captcha.

Schwerer wiegt die Barrierefreiheit. Laut dem W3C-Dokument Inaccessibility of CAPTCHA schließen solche Aufgaben viele Menschen mit Behinderung aus. Als Beispiel nennt es Menschen, die blind oder sehbehindert sind oder eine Legasthenie haben und verzerrte Zeichen in einer Grafik entziffern sollen. Audio-Captchas als Ersatz hält das W3C bei kognitiven Einschränkungen für eine schlechte Wahl.

Wortfilter mit gesperrten Wörtern

Ein Wortfilter, auch Wordlist genannt, prüft nicht den Absender, sondern den Text. Steht ein Wort aus Ihrer Sperrliste in der Nachricht, schickt das Formular sie nicht ab und zeigt eine Fehlermeldung. Als einziges Verfahren in diesem Ratgeber erwischt der Wortfilter auch Werbung, die ein Mensch eingetippt hat. Der Haken ist die Liste. Ist sie zu kurz, rutscht Spam durch, ist sie zu streng, trifft sie ehrliche Anfragen.

Für unser Kontaktformular-Script gibt es Captcha und Wortfilter als kostenpflichtige Module für jeweils einmalig 30 Euro inklusive Mehrwertsteuer, zu bestellen über das Bestellformular. Das Gästebuch-Script bietet beide ebenfalls als Zusatzmodule an und zeigt neue Einträge zudem erst nach Ihrer Freigabe.

Was Google reCAPTCHA technisch macht


Bei Google reCAPTCHA findet die Prüfung nicht auf Ihrem Server statt, sondern bei Google. Die folgenden Angaben stammen aus Googles Dokumentation (Stand Oktober 2026), in der reCAPTCHA inzwischen zum Angebot „Google Cloud Fraud Defense“ gehört.

  1. Ihre Seite lädt ein JavaScript von www.google.com. Google empfiehlt, es auf allen Seiten der Website einzubinden, nicht nur beim Formular.
  2. Sobald das Script startet, beginnt es laut Google, „Signale“ zu sammeln. Welche das sind, schlüsselt die Übersicht nicht auf.
  3. Beim Absenden fordert das Script bei Google eine Bewertung an und erhält einen verschlüsselten Token, der mit dem Formular an Ihren Server geht.
  4. Ihr Server schickt den Token an Google und bekommt eine Risikobewertung zwischen 0,0 und 1,0 zurück. Die Schnittstelle hat außerdem Felder, in denen Ihr Server IP-Adresse und Browserkennung des Besuchers mitschicken kann.

Dazu setzt reCAPTCHA ein Cookie namens _GRECAPTCHA für seine Risikoanalyse. Und weil der Browser das Script direkt bei Google abruft, erhält Google wie jeder Webserver schon beim Laden der Seite die IP-Adresse und die Kennung des Browsers. Ein Score-Schlüssel zeigt Ihren Besuchern weder ein Kästchen noch eine Captcha-Aufgabe. Bei einem Checkbox-Schlüssel klicken sie ein Kästchen an, danach kann eine Aufgabe folgen.

Welche rechtlichen Folgen das für Ihre Website hat, ist nicht Thema dieses Ratgebers. Technisch ist der Unterschied klar. Bei reCAPTCHA gehen Daten Ihrer Besucher an Google, der Spamschutz im Kontaktformular aus dem nächsten Abschnitt bleibt auf Ihrem Server.

Spamschutz im Kontaktformular ohne Captcha: drei Prüfungen


Ein Spamschutz im Kontaktformular ohne fremden Dienst braucht nur PHP und dessen Sessions, also Sitzungsdaten, die auf dem Server liegen. Jede der drei Prüfungen fängt eine andere Sorte Bot ab, deshalb lohnt sich die Kombination. In einem echten Script stehen sie hintereinander in derselben Datei.

CSRF-Token: Absendungen von fremden Seiten abweisen

Ein CSRF-Token ist eine Zufallszeichenfolge, die Ihr Script beim Ausliefern des Formulars erzeugt, in der Session speichert und als verstecktes Feld ins Formular schreibt. Beim Absenden vergleicht es den mitgeschickten Wert mit dem gespeicherten.

<?php
// formular.php: Token erzeugen und ins Formular schreiben
session_start();
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
$token = htmlspecialchars($_SESSION['csrf_token'], ENT_QUOTES, 'UTF-8');
?>
<form action="senden.php" method="post">
    <input type="hidden" name="csrf_token" value="<?= $token ?>">
    <!-- weitere Felder -->
</form>

<?php
// senden.php: Token prüfen, bevor etwas verschickt wird
session_start();
$token = $_POST['csrf_token'] ?? '';
if (!is_string($token) || empty($_SESSION['csrf_token'])
    || !hash_equals($_SESSION['csrf_token'], $token)) {
    exit('Ihre Sitzung ist abgelaufen. Bitte laden Sie das Formular neu.');
}

random_bytes() liefert kryptografisch sichere Zufallsbytes. hash_equals() vergleicht so, dass die Antwortzeit nichts über den richtigen Wert verrät.

Der Token stoppt Bots, die blind Daten an Ihr Script schicken, und Absendungen, die von fremden Websites aus angestoßen werden. Ein Bot, der das Formular vorher lädt, bekommt dagegen wie jeder Besucher einen gültigen Token.

Honeypot: ein Feld, das nur Bots ausfüllen

Ein Honeypot (Honigtopf) ist ein zusätzliches Eingabefeld, das Menschen nicht sehen. Bots, die jedes Feld ausfüllen, tragen dort etwas ein und verraten sich damit. Das W3C führt Honeypots als Alternative auf, die vom Nutzer nichts verlangt, und auch das Umfrage-Script auf php-space.info hält Bots mit einem versteckten Feld fern.

<!-- im Formular -->
<div class="hp" aria-hidden="true">
    <label for="kf_check">Dieses Feld bitte leer lassen</label>
    <input id="kf_check" type="text" name="kf_check" value=""
           tabindex="-1" autocomplete="off">
</div>

/* im Stylesheet */
.hp {
    position: absolute;
    left: -10000px;
    width: 1px;
    height: 1px;
    overflow: hidden;
}
<?php
// senden.php: Ist das versteckte Feld ausgefüllt, war es kein Mensch
if (($_POST['kf_check'] ?? '') !== '') {
    error_log('Kontaktformular: Honeypot ausgefüllt, Nachricht verworfen.');
    exit('Ihre Nachricht konnte nicht gesendet werden.');
}

Auf vier Einzelheiten kommt es an.

  • Das Feld ist ein normales Textfeld, kein type="hidden". Erst das CSS schiebt es aus dem sichtbaren Bereich, im Quelltext sieht es aus wie jedes andere Feld.
  • Der Name ist neutral. Heißt das Feld url, website oder homepage, füllt die Autovervollständigung des Browsers es womöglich selbst aus, und eine echte Nachricht wird abgelehnt.
  • tabindex="-1" verhindert, dass jemand mit der Tab-Taste hineinspringt. aria-hidden="true" blendet den Bereich für Screenreader aus.
  • Das Label hilft, falls jemand die Seite ohne CSS sieht.

Wie Formularfelder und Labels grundsätzlich aufgebaut sind, erklärt die Anleitung HTML-Formular erstellen. Bots, die einen echten Browser steuern oder für ein bestimmtes Formular geschrieben wurden, können das Feld erkennen und leer lassen.

Zeitprüfung: zu schnelle Absendungen erkennen

Ein Mensch braucht für Name, Adresse und Nachricht eine Weile, ein einfacher Bot kann das Formular im selben Moment abschicken, in dem er es geladen hat. Die Zeitprüfung merkt sich deshalb beim Ausliefern die Uhrzeit und lehnt Nachrichten ab, die schneller zurückkommen als eine Mindestzeit.

<?php
// formular.php: Startzeit beim Ausliefern merken
session_start();
$_SESSION['form_time'] = time();
<?php
// senden.php: Mindestzeit prüfen
session_start();
$mindestzeit = 3; // Sekunden
$start = $_SESSION['form_time'] ?? null;

if (!is_int($start)) {
    exit('Ihre Sitzung ist abgelaufen. Bitte laden Sie das Formular neu.');
}
if (time() - $start < $mindestzeit) {
    exit('Das ging sehr schnell. Bitte warten Sie einen Moment und senden Sie erneut.');
}

Die Startzeit gehört in die Session und nicht in ein verstecktes Feld, denn dort könnte ein Bot jeden beliebigen Wert eintragen. Setzen Sie die Mindestzeit nicht zu hoch, sonst trifft sie Besucher, deren Browser Name und Adresse automatisch einträgt. Zeigen Sie in einem echten Script statt exit() das Formular mit einer Meldung erneut an, damit die Eingaben stehen bleiben. Ein Bot, der ein paar Sekunden wartet, kommt allerdings durch.

Die Verfahren im Vergleich


Welcher Spamschutz im Kontaktformular passt, hängt davon ab, welcher Spam bei Ihnen ankommt. Die Tabelle zeigt, was jedes Verfahren von Ihren Besuchern verlangt, wogegen es hilft und ob Daten an einen fremden Dienst gehen.

VerfahrenAufwand für BesucherHält abHält nicht abDaten an Dritte
CSRF-TokenkeinerBots, die Daten direkt an das Script senden, und Absendungen über fremde SeitenBots, die das Formular vorher ladennein
HoneypotkeinerBots, die jedes Feld ausfüllenBots mit echtem Browser, gezielt für Ihr Formular geschriebene Bots, Menschennein
Zeitprüfungkeiner, außer bei sehr schnellem AbsendenBots, die sofort absendenBots, die einige Sekunden warten, Menschennein
Wortfilterkeiner, solange kein gesperrtes Wort vorkommtNachrichten mit gesperrten Wörtern, auch von Menschen getippteSpam ohne diese Wörternein
Bild-Captcha vom eigenen ServerZeichen abtippen, manchmal mehrere VersucheBots, die das Bild nicht lesen könnenMenschen, die Spam von Hand schickennein
Google reCAPTCHAje nach Schlüsseltyp keine Aufgabe, ein Klick oder zusätzlich eine Captcha-AufgabeZugriffe, die Googles Risikobewertung als automatisiert einstuftMenschen, die Spam von Hand schickenja, an Google

Die drei unsichtbaren Prüfungen ergänzen sich. Der Token fängt die blinden Absendungen, der Honeypot die eifrigen Ausfüller, die Zeitprüfung die Schnellen. Gegen Werbung von Menschen hilft nur der Wortfilter.

So setzt das Kontaktformular-Script 2.52 das um


Ab Version 2.52 steckt der Spamschutz im Kontaktformular-Script selbst, ohne Zusatzmodul und ohne fremden Dienst. Die Prüfungen laufen in kontakt.php in fester Reihenfolge ab, und die erste, die anschlägt, stoppt die Nachricht.

Ablaufschema: Eine abgeschickte Nachricht durchläuft nacheinander Honeypot, CSRF-Token, Zeitprüfung und Eingabeprüfung, erst dann folgt der Versand. Schlägt eine Prüfung an, wird die Nachricht mit einer Meldung abgelehnt.
Die Prüfkette in Version 2.52. Erst wenn alle vier Prüfungen bestanden sind, geht die Mail hinaus.

Im Einzelnen arbeitet das Script so.

  • Das Honeypot-Feld heißt kf_check und steht in template.html. Die CSS-Klasse .kf-hp und ein zusätzlicher Inline-Stil schieben es weit nach links aus dem Bild, die Attribute entsprechen dem Beispiel oben. Ist es ausgefüllt, sieht der Absender nur „Ihre Nachricht konnte nicht gesendet werden.“, und im Fehlerlog inc/error_log.php steht ein Eintrag. Fehlt das Feld in einer älteren template.html, fügt kontakt.php es selbst ein.
  • Der CSRF-Token besteht aus 32 Zufallsbytes, liegt in der Session und wird mit hash_equals() verglichen.
  • Für die Zeitprüfung legt das Script beim Ausliefern des Formulars die Uhrzeit in der Session ab. Die Mindestzeit steht in MIN_SEND_SECONDS, Vorgabe 3 Sekunden. Sie stellen den Wert im Installer ein, 0 schaltet die Prüfung ab. Auch zu schnell abgeschickte Nachrichten vermerkt das Script im Fehlerlog.
  • Vor- und Nachname dürfen keine Links enthalten, also kein www., kein :// und keine Endungen wie .com, .de oder .ru. Spitze Klammern und mehr als 60 Zeichen lehnt das Script ebenfalls ab.

Hintergrund der Namensprüfung ist die Bestätigungsmail. Sie geht an die Adresse, die im Formular steht, und enthält Vor- und Nachname. Ohne die Prüfung könnte jemand eine fremde Adresse eintragen und über Ihr Formular Werbung verschicken. Den Nachrichtentext enthält die mitgelieferte Vorlage der Bestätigung nicht. Wer gar keine Bestätigung verschicken möchte, schaltet sie im Installer ab.

Schlägt eine Prüfung an, bleibt das Formular mit den Eingaben stehen und zeigt eine Meldung. Für den Spamschutz lädt das Script nichts von fremden Servern, und keine Formulardaten gehen an einen Prüfdienst. Eingerichtet wird alles im Browser über install.php, wie in der Installationsanleitung beschrieben.

Was kein Verfahren abfängt


Kein Spamschutz im Kontaktformular hält jeden Spam auf, auch nicht mehrere Verfahren zusammen. Wer gezielt Ihr Formular angreift, lädt die Seite, lässt das Honeypot-Feld leer und wartet ein paar Sekunden. Dann passiert er Token, Honeypot und Zeitprüfung ohne Mühe. Gegen Werbung, die ein Mensch von Hand eintippt, hilft auch ein Captcha nicht, denn diese Aufgabe löst ein Mensch ohne Weiteres.

Umgekehrt können die Prüfungen echte Besucher treffen. Wer das Formular so lange offen lässt, dass die Session abläuft, muss noch einmal senden. Wer sehr schnell ist, sieht den Hinweis der Zeitprüfung, behält aber seine Eingaben und kann nach einem Moment erneut absenden. Stillschweigend verwirft das Script dabei nichts, der Absender bekommt immer eine Meldung. Erscheint die Erfolgsmeldung und trotzdem kommt keine Mail an, liegt es am Versand. Die Ursachen dafür stehen im Ratgeber Kontaktformular verschickt keine Mails.

Häufige Fragen zum Spamschutz im Kontaktformular


Kurze Antworten zu reCAPTCHA, Mindestzeit, Namensprüfung und älteren Designs.

Brauche ich Google reCAPTCHA als Spamschutz im Kontaktformular?

Technisch nötig ist es nicht. Gegen einfache Bots helfen CSRF-Token, Honeypot und Zeitprüfung, die auf Ihrem Server laufen und Ihre Besucher keine Mühe kosten. Ob sich ein Captcha zusätzlich lohnt, zeigt erst der Spam, der trotz der drei Prüfungen noch ankommt.

Kann ich die Mindestzeit ändern oder die Zeitprüfung abschalten?

Ja. Im Installer tragen Sie unter „Zeitprüfung in Sekunden“ einen Wert von 0 bis 60 ein, er landet als MIN_SEND_SECONDS in inc/config.php. Mit 0 ist die Prüfung aus. Ist der Installer schon gesperrt, legen Sie per FTP eine leere Datei inc/install.unlock an oder ändern den Wert direkt in inc/config.php.

Warum lehnt das Formular Namen mit www. oder .de ab?

Weil der Name in der Bestätigungsmail an die eingetragene Adresse steht. Ließe das Formular Links im Namen zu, könnten Spammer damit Werbung an fremde Postfächer schicken. Ein echter Name kommt ohne Links und spitze Klammern aus.

Funktioniert der Spamschutz im Kontaktformular-Script mit meinem Design aus Version 2.51?

Ja. kontakt.php fügt das Honeypot-Feld selbst ein, wenn es in Ihrer template.html fehlt. Das Feld bringt einen eigenen Inline-Stil mit und bleibt deshalb auch dann unsichtbar, wenn Ihr altes Stylesheet die Klasse .kf-hp nicht kennt.

Es kommt trotzdem Spam an. Was kann ich tun?

Sehen Sie sich die Nachrichten genauer an. Tauchen immer wieder dieselben Wörter auf, auch in Werbung von Menschen, hilft der Wortfilter. Kommen Bots durch alle drei Prüfungen, hilft das Captcha-Modul.

Kontaktformular-Script 2.52 herunterladen


Version 2.52 bringt CSRF-Token, Honeypot und Zeitprüfung mit, der Spamschutz im Kontaktformular-Script ist ohne weitere Einstellungen aktiv.

Kontaktformular-Script jetzt kostenlos herunterladen
Sie brauchen einen Spamschutz nach eigenen Vorgaben oder ein Captcha für ein anderes Script? Nehmen Sie Kontakt mit uns auf, dann erhalten Sie ein individuelles Angebot.

Zuletzt fachlich überprüft im Oktober 2026.

 


Copyright © 2006-2026 by KontaktFormular-Script.de