Kontaktformular-Spam stoppen ohne Captcha
Spam im Kontaktformular blocken, ohne Captcha: verstecktes Honeypot-Feld, Rate-Limit und einfache Inhaltsregeln. HTML zum Kopieren, keine Skripte von Dritten.
Viel Spam in Kontaktformularen kommt von Bots, die ein <form> auf deiner Seite finden und jedes Feld ausfüllen, das sie sehen. Ein Captcha hält viele davon auf, macht es aber auch echten Besuchern schwerer, lädt ein Skript eines Drittanbieters und gehört meist in deine Datenschutzerklärung. Für ein kleines Kontakt- oder Anfrageformular kannst du oft darauf verzichten: Ein paar unauffällige Prüfungen auf dem Server erwischen den typischen Bot, ohne dass deine Besucher etwas merken. Bei Formlane laufen diese Prüfungen am Endpoint https://smallwerk.com/formlane/api/submit. Du fügst deinem Formular ein verstecktes Feld hinzu, den Rest erledigt der Server. Einsendungen werden in Frankfurt gespeichert und an die Adresse deines Kontos gemailt; was die Inhaltsregeln als Spam markieren, landet in einem eigenen Spam-Tab statt in deinem Postfach.
So geht's
- Melde dich bei Formlane an, leg ein Formular an und kopiere den Access Key (
fl_…). - Füg das Formular unten in deine Seite ein und ersetze
fl_YOUR_ACCESS_KEYdurch deinen Key. Der Key ist absichtlich öffentlich, er darf also im HTML stehen. - Lass die versteckte Checkbox
botcheckgenau so, wie sie ist. Menschen sehen sie nie; Bots, die jedes Kästchen ankreuzen, verraten sich damit. - Beschränke das Formular in den Einstellungen auf deine Domain, damit Formulare auf anderen Websites nicht daran senden können.
- Schick eine Testnachricht und prüf dein Postfach und das Formlane-Dashboard.
Code
<form action="https://smallwerk.com/formlane/api/submit" method="POST"> <input type="hidden" name="access_key" value="fl_YOUR_ACCESS_KEY"> <input type="hidden" name="subject" value="New message from my website"> <input type="hidden" name="redirect" value="https://example.com/thanks"> <!-- Honeypot: hidden from people, leave it unchecked --> <input type="checkbox" name="botcheck" style="display:none" tabindex="-1" autocomplete="off"> <label for="name">Name</label> <input id="name" type="text" name="name" required> <label for="email">Email</label> <input id="email" type="email" name="email" required> <label for="message">Message</label> <textarea id="message" name="message" rows="5" required></textarea> <button type="submit">Send</button> </form>
Funktioniert auf jedem statischen Host (GitHub Pages, Netlify, Cloudflare Pages, Vercel) und mit Hugo, Astro oder Jekyll. Das Feld email wird zur Reply-To-Adresse der Benachrichtigung. Die Beschriftungen im Snippet (Name, Email, Message, Send) sind englisch; für eine deutsche Seite ersetzt du sie, die name-Attribute bleiben.
Was Formlane bei jeder Einsendung prüft
| Prüfung | Was sie erwischt | Was passiert |
|---|---|---|
Honeypot (botcheck; _gotcha und _honey gehen auch) | Bots, die jedes Feld ausfüllen oder ankreuzen | Eine normale Erfolgsantwort (HTTP 200 oder die übliche Weiterleitung), der Bot zieht weiter. Nichts wird gespeichert, gemailt oder gezählt |
| Rate-Limit: 10 Einsendungen in 10 Minuten pro Besucher und Formular | Skripte, die ein Formular überfluten | Weitere Einsendungen werden mit rate_limited (HTTP 429) abgelehnt |
| Inhaltsregeln: 4 oder mehr Links, Link-Markup, Spam-Begriffe | Link-Spam und typische Spam-Texte | Landet im Spam-Tab, wird nicht gemailt und zählt nicht zu deinem Monatskontingent |
| Erlaubte Domains (optional, pro Formular) | Formulare auf anderen Websites, die deinen öffentlichen Key nutzen (ein Skript mit gefälschtem Header kommt trotzdem durch) | Abgelehnt mit origin_not_allowed |
Kein Captcha, keine KI, kein Skript von Dritten. Deine Besucher sehen nur ein normales Formular.
Warum ein Honeypot funktioniert (und wo nicht)
Ein Honeypot ist ein Feld, das echte Menschen nie sehen oder anfassen. Einfache Bots lesen das HTML, füllen jedes Eingabefeld aus und kreuzen jede Checkbox an. Ein ausgefüllter Honeypot ist deshalb ein starkes Zeichen für einen Bot. Deine Besucher kostet das nichts: kein Rätsel, kein zusätzlicher Klick, kein Skript.
Eine Mauer ist er aber nicht. Ein Bot, der gezielt für deine Seite geschrieben wurde, oder ein Mensch, der Spam von Hand einfügt, lässt den Honeypot in Ruhe. Deshalb kombiniert Formlane ihn mit dem Rate-Limit und den Inhaltsregeln. Was die Inhaltsregeln markieren, landet in einem Spam-Tab, den du prüfen kannst, statt gelöscht zu werden; Honeypot-Treffer werden gar nicht gespeichert.
Tipps, die mit jedem Formular-Backend helfen:
- Benenne den Honeypot nicht sichtbar nach seinem Zweck (kein „Bitte leer lassen“-Label, das Screenreader vorlesen). Versteck ihn mit CSS und
tabindex="-1"wie im Code oben. - Markier Pflichtfelder mit
requiredund nutztype="email". Das hilft echten Besuchern. Bots überspringen Browser-Prüfungen, ein Spamfilter ist das allein also nicht. - Veröffentliche deine E-Mail-Adresse nicht neben dem Formular. Dafür ist das Formular ja da.
- Schau nach dem Start ein paar Tage in den Spam-Tab. Landet dort einmal eine echte Nachricht, siehst du sie.
Optional: per JavaScript senden
Für eine Bestätigung ohne Seitenwechsel schickst du das Formular als JSON und lässt den Honeypot im Formular. message in der Antwort ist immer englisch, deshalb zeigt das Snippet je nach error-Code einen eigenen Text. Die Texte im Snippet sind englisch; ersetz sie für eine deutsche Seite:
<script>
const MESSAGES = {
limit_reached: "This form can't take more messages this month. Please email us directly.",
rate_limited: "Too many messages in a short time. Please try again in a few minutes.",
origin_not_allowed: "This form only accepts messages from its own website.",
};
const form = document.querySelector('form[action*="formlane"]');
if (form) form.addEventListener("submit", async (event) => {
event.preventDefault();
// Keep the honeypot in the form: FormData skips it while unchecked, a bot that ticks it gets caught.
const data = Object.fromEntries(new FormData(form));
try {
const res = await fetch(form.action, {
method: "POST",
headers: { "Content-Type": "application/json", Accept: "application/json" },
body: JSON.stringify(data),
});
const json = await res.json();
form.outerHTML = json.success
? "<p>Thanks! Your message has been sent.</p>"
: "<p>" + (MESSAGES[json.error] || "Sorry, that didn't work. Please try again later.") + "</p>";
} catch {
alert("Network error. Please try again.");
}
});
</script>Du nutzt React oder Vite? Der React-Guide hat denselben Honeypot in einer fertigen Komponente.
Andere Wege (ehrlicher Vergleich)
| Weg | Gut für | Worauf du achten musst |
|---|---|---|
| Honeypot + Prüfungen auf dem Server (Formlane und viele gehostete Formular-Backends) | Kontakt- und Anfrageformulare ohne jede Hürde | Gezielte Bots und Spam von Hand kommen durch; schau ab und zu in den Spam-Ordner |
| Unsichtbare oder verwaltete Challenge (z. B. Cloudflare Turnstile) | Formulare, die trotz Honeypot stark angegriffen werden | Lädt ein Skript von Dritten; gehört in deine Datenschutzerklärung. Hält Bots nur auf, wenn ein Server das Token prüft (Formlane tut das heute nicht) |
| Klassisches Captcha (z. B. reCAPTCHA, hCaptcha) | Besonders wertvolle Ziele wie Registrierung oder Login | Eine sichtbare Aufgabe ist eine Hürde und für manche Besucher schwer zu lösen; Skript von Dritten und Eintrag in der Datenschutzerklärung |
| Eigene Serverless Function mit eigenen Regeln | Volle Kontrolle, eigene Logik | Prüfungen, Speicherung und E-Mail-Versand baust und pflegst du selbst |
Formlane passt, wenn du ein reines HTML-Formular auf einer statischen Seite willst, Spamschutz ohne Captcha und Einsendungen, die in Frankfurt gespeichert werden. Brauchst du heute Datei-Uploads, Autoresponder, Webhooks oder ein Captcha, nimm einen Dienst, der das schon kann: Formlane kann es noch nicht.
Preise
Free: 250 Einsendungen im Monat und bis zu 5 Formulare. Starter: 9 € im Monat für 2.500 Einsendungen. Pro: 19 € im Monat für 25.000 Einsendungen. Preise inkl. MwSt. Spam zählt nicht zum Monatskontingent. Ist das Kontingent aufgebraucht, werden neue Nachrichten abgelehnt, bis der nächste Monat beginnt oder du upgradest.
Weitere Anleitungen
Häufige Fragen
Kann ich Kontaktformular-Spam ohne Captcha stoppen?
Bei vielen kleinen Kontaktformularen ja. Ein verstecktes Honeypot-Feld, ein Rate-Limit pro Besucher und einfache Inhaltsregeln erwischen den typischen Formular-Bot ohne sichtbare Aufgabe. Formlane führt diese Prüfungen bei jeder Einsendung aus. Wird ein Formular gezielt angegriffen, kann eine Challenge wie Turnstile helfen, aber nur, wenn ein Server ihr Token prüft. Formlane prüft heute keine Captcha-Tokens.
Was ist ein Honeypot-Feld?
Ein Formularfeld, das per CSS vor Menschen versteckt ist. Echte Besucher füllen es nie aus, einfache Bots füllen alles aus. Kommt das Feld ausgefüllt oder angekreuzt an, stammt die Einsendung von einem Bot. Bei Formlane nimmst du eine versteckte, nicht angekreuzte Checkbox mit dem Namen botcheck.
Merken Bots, dass sie geblockt wurden?
Beim Honeypot nicht. Formlane beantwortet einen Honeypot-Treffer mit einer normalen Erfolgsantwort (HTTP 200 oder die übliche Weiterleitung) und speichert nichts, der Bot hat also keinen Grund für einen neuen Versuch. Einsendungen über dem Rate-Limit bekommen den Fehler rate_limited.
Zählt Spam zu meinem Monatskontingent?
Nein. Honeypot-Treffer werden gar nicht gespeichert. Nachrichten, die die Inhaltsregeln erwischen, landen im Spam-Tab, werden dir nicht gemailt und zählen nicht zu deinem Monatskontingent. Ist das Kontingent aufgebraucht, werden neue Nachrichten abgelehnt, bis der nächste Monat beginnt oder du upgradest.
Ist der Honeypot barrierefrei?
Ja, wenn er richtig versteckt ist: display:none nimmt ihn aus der Seite und aus Screenreadern, und tabindex="-1" hält ihn aus der Tastatur-Reihenfolge. Gib ihm kein sichtbares Label.
Können andere Websites meinen öffentlichen Access Key für Spam nutzen?
Mit dem Key kann man nur an dieses eine Formular senden. Damit andere Seiten ihn nicht nutzen, beschränkst du das Formular in den Einstellungen auf deine Domain; Browser auf anderen Seiten werden dann mit origin_not_allowed abgelehnt. Ein Skript, das den Header fälscht, kommt trotzdem durch; Honeypot, Rate-Limit und Inhaltsregeln greifen dann weiterhin.
Wo werden die Einsendungen gespeichert?
Einsendungen werden in Frankfurt gespeichert, in einer Supabase-Datenbank (Region eu-central-1). Die App läuft bei Vercel, Benachrichtigungen gehen über einen E-Mail-Dienstleister; alle Dienstleister stehen in der Datenschutzerklärung.
Access Key holen
Kostenlos für 250 Einsendungen pro Monat. Einsendungen werden in Frankfurt gespeichert.
Access Key holen