Anleitungen

Anleitungen16 Min. Lesezeit

So stoppst du Spam über dein Kontaktformular

Stopp Kontaktformular-Spam mit Schichten, die echte Menschen nichts kosten: Honeypot, Timing, Inhaltsbewertung, Rate-Limits und eine Menschlichkeitsprüfung nur bei Bedarf.

Preet SutharGründer, Ikiform

Staple günstige, unsichtbare Prüfungen, bevor du irgendeine Hürde einbaust: ein verstecktes Honeypot-Feld, eine Mindestzeit zum Ausfüllen des Formulars, eine Bewertung für Links und Spam-Phrasen und ein Rate-Limit pro Besucher. Füge eine Menschlichkeitsprüfung wie Cloudflare Turnstile erst hinzu, wenn trotzdem Spam durchkommt, und verifiziere ihr Token auf einem Server. Speichere, was du abfängst, statt es wegzuwerfen, damit du die gelegentliche echte Nachricht retten kannst.

Ein Kontaktformular auf einer öffentlichen Seite bekommt innerhalb weniger Tage nach der Indexierung Müll. Das meiste davon zielt nicht auf dich. Skripte durchsuchen das Web nach jedem <form>, füllen jedes Eingabefeld aus und senden es ab, in der Hoffnung, dass irgendwo ein Link landet. Ein kleinerer Teil kommt von echten Browsern, die von Software gesteuert werden, und manches von Menschen, die dafür bezahlt werden, denselben Pitch in Tausende Formulare zu kopieren. Jede Art wird von einer anderen Prüfung gestoppt, deshalb löst ein einzelner Trick das Problem nie.

Diese Anleitung erklärt jede Abwehr, was sie abfängt und was sie echte Besucher kostet, mit Code, den du auf jedem Stack ausführen kannst. Dann zeigt sie, wie Ikiform, ein Formular-Backend, dieselben Schichten für dich ausführt.

Schichten, die günstigste zuerst

Ordne die Prüfungen nach ihren Kosten. Requests zu zählen ist nahezu kostenlos, also läuft das, bevor irgendetwas den Body liest. Prüfungen, die einen anderen Dienst aufrufen, etwa ein Captcha, laufen erst, wenn die günstigen bestanden sind. Die Inhaltsbewertung kommt zuletzt, weil sie die geparsten Felder braucht. Ikiform führt seine Prüfungen bei jedem Post in dieser Reihenfolge aus.

Die Reihenfolge der Spamprüfungen, vom eintreffenden Post bis zu gespeichert oder SpamDirekt abgelehntBewertet, dann in jedem Fall gespeichertein Posttrifft einvon einerSeite, einemSkript odereinem ServerRate-Limitzu viele voneinemBesucher: 429erlaubteDomainsvon eineranderen Sitegesendet?MenschlichkeitsprüfungTurnstile-Token,wennaktiviertHoneypotausgefüllt:+5Timing undInhaltzu schnell,Links,Phrasen,WiederholungenScore 5odermehr?angenommenE-Mail undWebhooksgehen rausSpamgleicheErfolgsantwort,nichtsgesendetZählungOriginTokenneinjaDie Reihenfolge der Spamprüfungen, vom eintreffenden Post bis zu gespeichert oder SpamDirekt abgelehntBewertet, dann in jedem Fall gespeichertein Post triffteinvon einer Seite,einem Skript odereinem ServerRate-Limitzu viele von einemBesucher: 429erlaubteDomainsvon einer anderenSite gesendet?MenschlichkeitsprüfungTurnstile-Token,wenn aktiviertHoneypotausgefüllt: +5Timing undInhaltzu schnell, Links,Phrasen,WiederholungenScore 5oder mehr?angenommenE-Mail und Webhooksgehen rausSpamgleicheErfolgsantwort,nichtsgesendetZählungOriginTokenneinja
  1. Ein Post trifft am Formular-Endpunkt ein.
  2. Das Rate-Limit zählt zuerst die Posts pro Besucher. Eine Flut wird mit 429 abgelehnt, bevor der Body gelesen wird.
  3. Erlaubte Domains vergleichen die Seite, von der der Post kam, mit den Domains, die du eingetragen hast.
  4. Ist die Menschlichkeitsprüfung an, muss der Post ein gültiges Turnstile-Token enthalten.
  5. Der Honeypot erhöht den Score um 5, wenn er ausgefüllt ist.
  6. Timing, Links, bekannte Spam-Phrasen, Wegwerfadressen und Wiederholungen erhöhen ihn um kleinere Beträge.
  7. Ab 5 wird der Post als Spam gespeichert. Darunter wird er angenommen, und deine E-Mail und Webhooks gehen raus.
Die obere Reihe lehnt Posts ab. Die untere Reihe lehnt nie ab: Sie bewertet, sodass ein Fehlalarm einen Klick zum Wiederherstellen kostet, keine verlorene Nachricht.

Die Abwehrmaßnahmen im Vergleich

Jede Abwehr hat ihren Preis. Die Tabelle sagt ehrlich, was jede verpasst und was sie von den Leuten verlangt, von denen du hören willst.

AbwehrStopptVerpasstKosten für echte Besucher
HoneypotSkripte, die jedes Eingabefeld ausfüllenBots, die CSS lesen oder versteckte Felder überspringen, und MenschenKeine, wenn es vor Screenreadern und Autofill verborgen ist
ZeitfallePosts, die schneller gesendet werden, als jemand tippen kannLangsame Bots und Bots, die wartenKeine, solange das Minimum ein paar Sekunden beträgt
Inhaltsbewertung, etwa Linkanzahl, Spam-Phrasen oder AkismetSEO-Pitches, Link-Drops, Casino- und Pillen-SpamSauber aussehenden Spam, und sie kann eine echte Nachricht mit Links markierenKeine, wenn du prüfst, was sie abfängt
Rate limitingFluten und Skripte in einer SchleifeLangsamen, verteilten SpamBüros und Events hinter einer IP können an ein knappes Limit stoßen
Erlaubte DomainsPosts, die von anderswo direkt an deinen Endpunkt gesendet werdenSkripte, die den Origin-Header fälschenKeine
Cloudflare TurnstileDie meisten automatisierten BrowserBezahlte menschliche SpammerMeist unsichtbar. Manchmal ein Klick, und es braucht ein Skript
reCAPTCHA oder hCaptchaDie meisten automatisierten BrowserBezahlte menschliche Spammer und LösungsdiensteBilderrätsel für manche Besucher, plus ein Drittanbieter-Skript

Fang mit den ersten fünf an. Sie sind unsichtbar und fangen den Großteil dessen ab, was eine kleine Site abbekommt. Füge eine Menschlichkeitsprüfung hinzu, wenn dir das Dashboard zeigt, dass trotzdem Spam durchkommt, nicht vorher: Sie ist die einzige Schicht mit Kosten, die jeder Besucher spüren kann. Die Seite zu Spam stoppen ohne Captcha zeigt, wie weit die unsichtbaren Schichten allein kommen.

Lies den Spam, bevor du ihn bekämpfst

Sieh dir zehn Spam-Nachrichten an, bevor du eine Lösung wählst. Was sie gemeinsam haben, verrät dir, wer sie sendet, und das zeigt auf die Schicht, die sie stoppt.

Vom Aussehen des Spams zur Schicht, die ihn stopptzufälliger Text injedem Feldein Skript-Botparst das HTML, fülltalle FelderHoneypotDutzende proMinute, eine Quelleein Skript in einerSchleifeRate-Limitsaubere Postsbinnen einerSekundeeinHeadless-BrowserZeitfalle,Menschlichkeitsprüfunghöfliche Pitchesmit Linksein Mensch, proFormular bezahltInhaltsbewertung,DurchsichtWas du siehstWer es sendetWas es stopptVom Aussehen des Spams zur Schicht, die ihn stopptzufälliger Text in jedemFeldein Skript-Botparst das HTML, füllt alleFelderHoneypotDutzende pro Minute, eineQuelleein Skript in einerSchleifeRate-Limitsaubere Posts binneneiner Sekundeein Headless-BrowserZeitfalle,Menschlichkeitsprüfunghöfliche Pitches mitLinksein Mensch, pro FormularbezahltInhaltsbewertung,Durchsicht
  1. Zufälliger Text in jedem Feld kommt von einem Skript, das alle Eingabefelder ausfüllt. Ein Honeypot fängt es ab.
  2. Dutzende Posts pro Minute aus einer Quelle kommen von einem Skript in einer Schleife. Ein Rate-Limit stoppt es.
  3. Saubere Posts, die innerhalb einer Sekunde nach dem Laden der Seite gesendet werden, kommen von einem Headless-Browser. Eine Zeitfalle oder eine Menschlichkeitsprüfung stoppt ihn.
  4. Höfliche Pitches mit Links kommen von Menschen, die pro Formular bezahlt werden. Nur Inhaltsbewertung und deine eigene Durchsicht fangen sie ab.
Kein Captcha stoppt die letzte Zeile. Ein Mensch kann es lösen, also sind Inhaltsbewertung und ein wöchentlicher Blick in den Spam-Ordner die einzige Abwehr.

Ein Kontaktformular mit eingebauten Schichten

Hier ist ein Kontaktformular, für jeden Stack gebaut. Jede Version hat den außerhalb des sichtbaren Bereichs platzierten Honeypot und eine Menschlichkeitsprüfung. Die reinen Browser-Versionen nutzen die verwaltete Turnstile-Prüfung von Ikiform, die keine Schlüssel braucht. Die Server-Versionen zeigen den Do-it-yourself-Weg: Dein Server verifiziert ein Turnstile-Token mit deinen eigenen Cloudflare-Schlüsseln und leitet dann die Felder weiter. Wähle unten deinen Stack; die Wahl gilt für jedes Codebeispiel in diesen Anleitungen.

Die Server-Tabs teilen sich zwei kleine Helfer. verifyTurnstile fragt Cloudflare, ob ein Token echt ist, und sendToIkiform leitet die Felder mit deinem Secret Key und dem Origin-Header des Besuchers weiter. Ein serverseitiges fetch sendet keinen eigenen Origin, und Ikiform liest ihn, um einen kostenlosen localhost-Test zu erkennen. Beide schlagen sicher fehl: Ist Cloudflare nicht erreichbar, sieht der Besucher einen Fehler statt eines stillen Durchwinkens.

lib/spam.ts
const SITEVERIFY = "https://challenges.cloudflare.com/turnstile/v0/siteverify";
const ENDPOINT = "https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx";

export interface Contact {
  name: string;
  email: string;
  message: string;
  _gotcha: string;
}

export function readContact(data: FormData): Contact {
  return {
    name: String(data.get("name") ?? "").trim(),
    email: String(data.get("email") ?? "").trim(),
    message: String(data.get("message") ?? "").trim(),
    _gotcha: String(data.get("_gotcha") ?? ""),
  };
}

export async function verifyTurnstile(input: { secret: string; token: string; ip?: string | null }) {
  if (!input.token || input.token.length > 2048) return false;
  const body = new URLSearchParams({ secret: input.secret, response: input.token });
  if (input.ip) body.set("remoteip", input.ip);
  try {
    const response = await fetch(SITEVERIFY, { method: "POST", body });
    const result = (await response.json()) as { success?: boolean };
    return result.success === true;
  } catch {
    return false;
  }
}

export async function sendToIkiform(secretKey: string, contact: Contact, origin?: string | null) {
  try {
    const response = await fetch(ENDPOINT, {
      method: "POST",
      headers: {
        Accept: "application/json",
        "Content-Type": "application/json",
        Authorization: `Bearer ${secretKey}`,
        ...(origin ? { Origin: origin } : {}),
      },
      body: JSON.stringify(contact),
    });
    const result = await response.json().catch(() => null);
    if (result?.ok) return { ok: true as const };
    const fields: Record<string, string[]> = result?.error?.fields ?? {};
    const first = Object.values(fields)[0]?.[0];
    return {
      ok: false as const,
      status: response.status,
      message: String(first ?? result?.error?.message ?? "Couldn't send your message. Try again."),
    };
  } catch {
    return { ok: false as const, status: 502, message: "Couldn't reach the form service. Try again." };
  }
}

Das einfache Formular braucht kein Skript. Setze Spam check des Ikiform-Formulars auf Ikiform, dann bekommt ein Post ohne Token eine kurze Prüfseite auf ikiform.com, die Turnstile ausführt und die Felder weiterschickt. Wer sie unsichtbar besteht, merkt nichts davon.

contact.html
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="POST">
  <label for="name">Name</label>
  <input id="name" name="name" autocomplete="name" required maxlength="120" />

  <label for="email">Email</label>
  <input id="email" name="email" type="email" autocomplete="email" required />

  <label for="message">Message</label>
  <textarea id="message" name="message" rows="5" required minlength="10" maxlength="5000"></textarea>

  <div class="hp" aria-hidden="true">
    <label for="hp-field">Leave this empty</label>
    <input id="hp-field" name="_gotcha" type="text" tabindex="-1" autocomplete="off" />
  </div>

  <button>Send message</button>
</form>

<style>
.hp {
  position: absolute;
  left: -10000px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}
</style>

Der Honeypot liegt außerhalb des sichtbaren Bereichs statt hinter display: none, weil manche Bots Felder überspringen, die so versteckt sind. aria-hidden am Wrapper und tabindex am Eingabefeld halten Screenreader und Tastatur davon fern.

  • Jede Version nutzt die Klasse .hp aus dem Style-Block des HTML-Tabs. Leg sie in dein globales CSS.
  • Der Honeypot heißt _gotcha, der Standard von Ikiform. Die Server-Versionen leiten ihn unverändert weiter, sodass ein ausgefüllter trotzdem mit dem Grund honeypot in deinem Spam-Ordner landet.
  • Turnstile fügt dem Formular ein verstecktes Eingabefeld cf-turnstile-response hinzu. Ein Token ist 300 Sekunden gültig und funktioniert einmal, jeder Versuch braucht also ein neues.
  • Mit Testschlüsseln von Cloudflare kannst du das alles lokal ausführen. Die Turnstile-Anleitung listet sie auf.
Die serverseitigen Versionen senden mit einem Secret Key, daher überspringt Ikiform Allowed domains und seine Menschlichkeitsprüfung. Jeder Post kommt dann von der IP deines Servers, und das Standard-Limit von 5 pro Minute und Besucher zählt alle deine Besucher zusammen. Wähle für ein Formular, das du über einen Server sendest, das Rate-Limit Relaxed oder Custom, und halte IKIFORM_SECRET_KEY in reinen Server-Umgebungsvariablen.

Probier die Felddefinition unten aus. Sie führt den Validator von Ikiform in deinem Browser aus, mit denselben Regeln, die der Server anwendet, bevor ein Spam-Score berechnet wird.

Vorschau

Führt den Validator von Ikiform in deinem Browser aus. Es wird nichts gesendet.

Dieselben Felder wie in der Kontaktformular-Vorlage. Füge die Definition im Tab Fields des Formulars ein, und Ikiform lehnt Posts, die nicht passen, mit 422 validation_failed ab.

Der Honeypot

Ein Honeypot ist ein Eingabefeld, das Menschen nie sehen und Bots ausfüllen. Hat es einen Wert, kam der Post von Software. Es kostet Besucher nichts und fängt die ältesten, häufigsten Bots ab, die das HTML parsen und jedes Eingabefeld ausfüllen, das sie finden.

Wie gut du es versteckst, zählt mehr als der Trick selbst. Bei nachlässigen Honeypots gehen drei Dinge schief:

  • Screenreader lesen ihn vor. Ein blinder Besucher hört ein zusätzliches Feld, füllt es aus und wird als Spam markiert. Pack es in aria-hidden="true" und gib ihm ein Label, das sagt, es leer zu lassen.
  • Die Tastatur landet darauf. Beim Tabben durch das Formular hält der Fokus auf einem unsichtbaren Eingabefeld. tabindex="-1" nimmt es aus der Tab-Reihenfolge.
  • Autofill füllt ihn aus. Browser und Passwortmanager füllen Felder anhand ihres Namens. Nennst du das Feld email2 oder phone, füllen manche es für echte Menschen aus. Verwende einen Namen, den kein Autofill erkennt, etwa _gotcha, und füge autocomplete="off" hinzu.

Die Honeypot-Anleitung behandelt Techniken zum Verstecken, wie Bots sie erkennen, und die serverseitige Prüfung für jeden Stack. Bei Ikiform erhöht ein ausgefüllter Honeypot den Score um 5, was allein die Schwelle von 5 erreicht. Du kannst das Feld pro Formular unter Honeypot field umbenennen.

Timing

Menschen brauchen Sekunden, um ein Kontaktformular auszufüllen. Viele Bots brauchen Millisekunden. Eine Zeitfalle hält fest, wann das Formular gerendert wurde, und prüft beim Absenden den Abstand. Die naive Version legt einen Zeitstempel in ein verstecktes Feld:

Zeitfalle, die naive Version
const started = Number(formData.get("started"));
const seconds = (Date.now() - started) / 1000;
const tooFast = !Number.isFinite(seconds) || seconds < 3;

Ein Bot kann jede beliebige Zahl senden, ein einfacher Zeitstempel stoppt also nur Bots, die sich keine Mühe geben. Signiere ihn auf dem Server mit einem Secret, dann kann der Bot kein langsameres Rendern vortäuschen. Die Seite zu Spam stoppen ohne Captcha baut die signierte Version.

Ikiform signiert Render-Zeitpunkte für dich, wenn das Formular aus dem SDK oder der shadcn/ui-Komponente kommt: Sie senden _ikiform_ts, und ein Post weniger als 2 Sekunden nach dem Rendern erhöht den Score um 3. Ein gefälschter oder einen Tag alter Zeitstempel erhöht ihn um 3. Einfache HTML-Formulare senden keinen und werden nicht bestraft.

Den Inhalt bewerten

Mancher Spam wird von Menschen getippt oder eingefügt und besteht daher jede Bot-Prüfung. Was ihn verrät, ist der Inhalt: Links, Verkaufsphrasen, Wegwerfadressen und derselbe Text zweimal. Bewerte jedes Signal und behandle eine hohe Summe als Spam, statt bei einem einzelnen zu blockieren. Ein Link in einer Nachricht ist normal; ein Link im Namensfeld nie.

SignalIkiform addiert
Der Honeypot ist ausgefüllt+5
Ein Link in einem Namens- oder Betreff-Feld+3
Dieselben Felder in den letzten 24 Stunden an dieses Formular gesendet+3
Weniger als 2 Sekunden nach dem signierten Render-Zeitpunkt gesendet+3
Drei oder mehr Links über alle Felder+2
Eine von 22 bekannten Spam-Phrasen, etwa „seo services“+2
Eine Adresse auf einer Wegwerf-E-Mail-Domain+2

Ab 5 ist der Post Spam. Kein einzelnes weiches Signal erreicht das: Eine echte Nachricht mit drei Links kommt auf 2. Zwei zusammen schaffen es oft, etwa ein Link im Namen und eine Spam-Phrase. Wenn du Inhalte selbst bewertest, ist Akismet die altbewährte gehostete Option; viele Teams fangen mit ein paar regulären Ausdrücken wie den oben an.

Eine Menschlichkeitsprüfung

Eine Menschlichkeitsprüfung verlangt vom Browser den Nachweis, dass ein Mensch ihn bedient. Moderne Varianten wie Cloudflare Turnstile laufen meist unsichtbar und zeigen nur bei Unsicherheit eine Checkbox. Das Widget gibt dem Browser ein Token; dein Server muss dieses Token zur Verifizierung an den Anbieter senden. Ein Token, das nie auf einem Server verifiziert wird, stoppt nichts, weil ein Bot das Widget überspringen und ohne Token senden kann.

Ikiform hat unter Spam check an jedem Formular drei Einstellungen:

EinstellungWas passiertCodeänderungen
Off (the default)Keine Challenge. Honeypot, Timing und Bewertung laufen weiterhin.Keine
IkiformTurnstile, von Ikiform auf ikiform.com ausgeführt, ohne Cloudflare-Konto oder SchlüsselKeine bei HTML-Posts. fetch-Posts rufen zuerst challenge() aus @ikiform/sdk auf
Your own Turnstile keys (eigene Schlüssel)Dein Widget und dein Secret Key. Ikiform verifiziert das Token und prüft seinen Hostnamen gegen deine erlaubten DomainsRendere das Widget in deinem Formular, damit es cf-turnstile-response sendet

Ein fetch-Post ohne Token bekommt 403 challenge_required. Ist Cloudflare nicht erreichbar, behält Ikiform den Post und speichert ihn mit dem Grund captcha_unavailable als Spam, damit du ihn wiederherstellen kannst. Die Spam-Dokumentation zeigt beide Abläufe. Wenn du Turnstile gegen Googles reCAPTCHA oder hCaptcha abwägst, sieh dir die reCAPTCHA-Alternativen an.

Rate-Limits und erlaubte Domains

Ein Rate-Limit begrenzt, wie oft ein Besucher senden kann. Es unterscheidet Spam nicht von echter Post; es stoppt Masse. Zähle pro IP und Formular, erlaube einen kleinen Burst und antworte mit 429 und einem Retry-After-Header. Die Anleitung zu Rate-Limits baut eines für jeden Stack und erklärt, warum ein Zähler im Arbeitsspeicher auf Serverless-Hosts scheitert.

Ikiform zählt jeden Post exakt, bevor der Body gelesen wird. Jedes Formular wählt ein Preset: Standard, 5 pro Minute und Besucher, Relaxed, 20 pro Minute und Besucher, oder Strict, 2 alle 10 Minuten pro Besucher. Standard erlaubt außerdem höchstens 3 alle 10 Sekunden, und das ganze Formular nimmt 300 pro Minute an. Zu einem Kontaktformular passt Strict, weil niemand mit ehrlichen Absichten zweimal in zehn Minuten schreibt. Die Zahlen stehen unter Rate-Limits.

Allowed domains listet die Sites auf, auf denen dein Formular läuft. Ein Post von jeder anderen Seite wird als Spam markiert oder mit 403 origin_not_allowed abgelehnt, wenn du Reject wählst. Das hält Leute davon ab, ihre eigenen Formulare auf deinen Endpunkt zu richten. Ein entschlossenes Skript kann den geprüften Header fälschen, also betrachte es als eine Schicht, nicht als Schloss.

Was mit Spam passiert

Sag einem Bot nie, dass er erwischt wurde. Ein Fehler zeigt ihm, was er ändern muss; eine normale Erfolgsseite zeigt ihm nichts. Und lösche Spam nie beim Eintreffen: Jeder Filter fängt ab und zu eine echte Nachricht ab, und eine gelöschte ist weg.

Ein als Spam eingestufter Post bekommt dieselbe Erfolgsantwort wie ein echter, ein Bot lernt also nichts. Er wird mit dem Status spam gespeichert, löst weder Benachrichtigungs-E-Mail noch Webhook aus, zählt nicht zu deiner Nutzung und wird nach 30 Tagen gelöscht. Jeden Montag bekommt ein Workspace, der Spam blockiert hat, eine Zusammenfassung per E-Mail mit der Gesamtzahl, den meistbetroffenen Formularen und den häufigsten Gründen.

Öffne den Statusfilter im Dashboard und wähle Spam, um jeden Eintrag mit Score und Gründen zu sehen. Not spam verschiebt ihn zurück, und dann gehen seine E-Mail und Webhooks raus. Schalte die Montags-E-Mail unter Weekly spam summary in den Workspace-Einstellungen aus. Spam wird 30 Tage aufbewahrt, also schau mindestens einmal im Monat nach.

Wenn eine echte Nachricht immer wieder hängen bleibt, lies ihre Gründe. Ein Link in einem Feld namens business_name wird als Link in einem Namen gewertet; benenne das Feld in business um, dann zählt es nicht mehr als Namensfeld.

Wähle deinen Fall

Jede dieser Seiten geht tiefer auf eine Abwehr oder eine Art von Site ein, mit Code für diesen Fall.

Prüfen, ob es funktioniert

Probier das an einem Testformular aus, bevor du dich darauf verlässt. Ikiform hat keinen kostenlosen Tarif. Testen ist kostenlos: Ein Workspace ohne Tarif nimmt 50 Testeinsendungen pro Monat von localhost an. Für den Livebetrieb wähle Pro ab $6/Monat für 500 Einsendungen oder zahle einmalig: 10.000 Einsendungen für $49 oder 50.000 Einsendungen für $149, mit Guthaben, das nie verfällt. Siehe Preise.

  1. Füge unter Allowed domains des Formulars die Domain deiner Site hinzu, plus localhost, während du entwickelst. Lass das Feld leer, um Posts von überall anzunehmen.
  2. Füll das Formular auf deiner Seite aus und sende es ab. Du landest auf deiner Dankeseite oder der gehosteten von Ikiform.
  3. Öffne Submissions im Dashboard. Die neue Einsendung ist da, mit jedem Feld, das du gesendet hast.
  4. Sende einen Post mit ausgefülltem Honeypot, _gotcha=bot. Er bekommt trotzdem eine Erfolgsantwort, aber die Einsendung wird als Spam gespeichert und löst weder E-Mail noch Webhook aus.
  5. Sende eine Nachricht mit einem Link im Namensfeld und der Phrase seo services in der Nachricht. Sie wird mit den Gründen url_in_name und keyword als Spam gespeichert.
  6. Stell Spam check auf Ikiform und sende das einfache HTML-Formular ab. Du siehst kurz die Prüfseite, dann deine Dankeseite.
  7. Sende das Formular ein paarmal hintereinander ab. Über dem Limit antwortet das Formular mit 429, und der Besucher sieht die Bremsseite von Ikiform.
  8. Nichts angekommen? Stell den Statusfilter im Dashboard auf Spam. Spam bekommt dieselbe Erfolgsantwort wie eine echte Einsendung.

Fehlerbehebung

ProblemWas zu tun ist
Die Einsendung ist im Dashboard, aber keine E-Mail und kein Webhook kam anSie wurde als Spam gespeichert. Spam löst nichts aus. Öffne sie unter dem Filter Spam, um die Gründe zu sehen, und markiere sie als kein Spam, um ihre E-Mail und Webhooks zu senden.
403 challenge_requiredDie Spamprüfung des Formulars steht auf Ikiform, und ein fetch-Post hatte kein Token. Hol dir vor jedem Absenden eins mit challenge(formId) aus @ikiform/sdk oder schalte die Prüfung aus.
403 origin_not_allowed, oder jeder Post landet im SpamDie Domain der Seite steht nicht unter Allowed domains des Formulars. Füge sie hinzu, plus localhost für lokale Tests. Subdomains einer eingetragenen Domain sind erlaubt.
429 rate_limitedEin Besucher hat mehr gesendet, als das Rate-Limit des Formulars erlaubt. Standard erlaubt 5 pro Minute und Besucher. Warte Retry-After ab oder wähle Relaxed oder Custom für Formulare, die von einer gemeinsamen IP aus senden.
403 captcha_failedDas Turnstile-Token fehlte, war abgelaufen oder wurde zweimal verwendet. Tokens leben 300 Sekunden und funktionieren einmal, also rendere nach jedem Versuch ein frisches Widget oder ruf challenge() erneut auf.
Spam kommt weiterhin als angenommen anÖffne einen und lies, was er mit den anderen gemeinsam hat. Gegen geskripteten Spam hilft Spam check auf Ikiform; gegen getippte Pitches ein strengeres Rate-Limit und eine wöchentliche Durchsicht.
Echte Besucher melden, dass sie nicht senden könnenPrüfe, ob der Honeypot vor Screenreadern verborgen und so benannt ist, dass Autofill ihn überspringt, und ob ein strenges Rate-Limit nicht Leute hinter einer gemeinsamen Büro-IP erwischt.

Fragen

Hängst du bei einem Schritt fest oder willst eine Anleitung für deinen Fall? Schreib an hello@ikiform.com.