Spam im Kontaktformular stoppen

Spam im Kontaktformular stoppen6 Min. Lesezeit

reCAPTCHA-Alternativen für Website-Formulare

Vergleiche reCAPTCHA-Alternativen für Formulare, von Turnstile und hCaptcha bis Proof-of-Work und ganz ohne Captcha, und wechsle mit einer kleinen, sicheren Änderung.

Preet SutharGründer, Ikiform

Cloudflare Turnstile ist der naheliegendste Ersatz für reCAPTCHA: Es ist meist unsichtbar, nutzt dasselbe Muster aus Site Key und Secret Key, und seine Serverprüfung nimmt dieselben Parameter. hCaptcha passt zu Sites, die Bild-Challenges von jemand anderem als Google wollen, und Proof-of-Work-Tools wie ALTCHA laufen ganz ohne Drittanbieter. Bei vielen Kontaktformularen machen Honeypot, Inhaltsbewertung und Rate-Limit ein Captcha überflüssig.

Warum Leute von reCAPTCHA wegwechseln

reCAPTCHA funktioniert noch. Die Gründe für einen Ersatz drehen sich meist um die Kosten für Besucher und für dich. Version 2 zeigt manchen Besuchern Bilderrätsel, was auf dem Handy langsam und für Screenreader-Nutzer schwierig ist. Version 3 ist unsichtbar, liefert aber einen Score, für den du selbst die Schwelle setzen musst, ohne Challenge als Rückfallebene. Und reCAPTCHA ist jetzt ein Google-Cloud-Produkt: Googles Abrechnungsdokumentation nennt ein kostenloses Kontingent von 10.000 Assessments pro Monat, mit kostenpflichtigen Stufen darüber.

Manche Teams wollen außerdem weniger Drittanbieter-Skripte auf ihren Seiten. Ob das für deine Datenschutzpflichten relevant ist, ist eine Frage für deine eigene rechtliche Prüfung; diese Seite vergleicht nur, wie die Tools funktionieren.

Die Alternativen im Vergleich

OptionWas Besucher sehenWer verifiziertGut zu wissen
reCAPTCHA v2Eine Checkbox, manchmal BilderrätselDein Server, bei GoogleVertraut. Die Rätsel sind der Hauptkritikpunkt
reCAPTCHA v3NichtsDein Server, bei GoogleLiefert einen Score von 0,0 bis 1,0. Du wählst die Grenze und kümmerst dich um die Grauzone
Cloudflare TurnstileMeist nichts, manchmal eine CheckboxDein Server, bei CloudflareKeine Bilderrätsel. Kostenlos für bis zu 20 Widgets
hCaptchaEine Checkbox, manchmal BilderrätselDein Server, bei hCaptchaVom Aufbau her ähnlich wie reCAPTCHA v2, von einem anderen Unternehmen. Ein kostenloser Basic-Tarif, mit kostenpflichtigen Pro- und Enterprise-Tarifen
Friendly CaptchaEin kleines Widget, das im Hintergrund ein Rätsel löstDein Server, bei Friendly CaptchaProof-of-Work statt Tracking-Signalen. Kostenlos für kleine nicht kommerzielle Sites, kostenpflichtige Tarife für alle anderen
ALTCHAEin kleines Widget, das im Hintergrund ein Rätsel löstNur dein eigener ServerOpen Source und selbst gehostet, also ohne Drittanbieter. Du betreibst und pflegst es
No captchaNichtsDein ServerHoneypot, signiertes Timing, Inhaltsbewertung und Rate-Limits. Stoppt die meisten Bots, nicht alle

Jede Option außer der letzten hängt weiterhin von einer serverseitigen Prüfung ab. Ein Widget allein stoppt nichts, weil ein Bot an deinen Endpunkt senden kann, ohne die Seite zu laden.

Was jede Option von Menschen verlangt

Beurteile jede Option nach dem Besucher, der sich damit am schwersten tut. Bilderrätsel sind auf dem Handy langsam und für jemanden, der schlecht sieht, schwer oder unmöglich; Audio-Alternativen helfen manchen und frustrieren andere. Unsichtbare Prüfungen wie der übliche Modus von Turnstile, reCAPTCHA v3 und Proof-of-Work-Widgets verlangen von den meisten Besuchern nichts, können aber bei Leuten mit datenschutzorientierten Browsern, strengen Netzwerken oder alten Geräten trotzdem scheitern. Wenn das passiert, braucht die Person einen Ausweg: eine sichtbare Checkbox, eine klare Meldung oder eine E-Mail-Adresse, an die sie stattdessen schreiben kann. Ein Formular, das still scheitert, verliert genau die Nachrichten, von denen du nie erfährst.

In zwei Fragen entscheiden

Einen reCAPTCHA-Ersatz in zwei Fragen wählenHier startenKein Server: statische Site oder Baukastenkommen BotsanunsichtbarenPrüfungenvorbei?kannst duServercodeausführen?dein eigenesWidgetTurnstile, hCaptchaoder ALTCHAohne CaptchableibenHoneypot, Bewertung,Rate-LimitFormular sendet anein BackendBackendverifiziert deineSchlüsselnur Turnstile, mitIkiformoder eineverwaltete Prüfunggar keine SchlüsseljajaneinEinen reCAPTCHA-Ersatz in zwei Fragen wählenHier startenKein Server: statische Site oder Baukastenkommen BotsanunsichtbarenPrüfungenvorbei?kannst duServercodeausführen?dein eigenesWidgetTurnstile, hCaptchaoder ALTCHAohneCaptchableibenHoneypot,Bewertung,Rate-LimitFormular sendetan ein BackendBackendverifiziertdeine Schlüsselnur Turnstile, mitIkiformoder eineverwaltetePrüfunggar keine Schlüsseljajanein
  1. Frag zuerst, ob Bots an unsichtbaren Prüfungen vorbeikommen. Wenn nicht, bleib ohne Captcha, mit Honeypot, Bewertung und Rate-Limit.
  2. Wenn doch, frag, ob du Servercode ausführen kannst. Wenn ja, wähle ein Widget wie Turnstile, hCaptcha oder ALTCHA und verifiziere es auf deinem Server.
  3. Ohne Server sende das Formular an ein Backend, das deine Turnstile-Schlüssel für dich verifiziert, oder nutze eine verwaltete Prüfung, die keine Schlüssel braucht.
Die meisten Kontaktformulare enden bei der ersten Frage. Miss deinen Spam, bevor du irgendein Widget hinzufügst.

Von reCAPTCHA zu Turnstile wechseln

Die beiden sind sich so ähnlich, dass der Wechsel auf jeder Seite nur ein paar Zeilen umfasst. Leg im Cloudflare-Dashboard ein Turnstile-Widget für dieselben Hostnamen an und ändere dann Markup und Serverprüfung gemeinsam.

TeilreCAPTCHA v2Turnstile
Skripthttps://www.google.com/recaptcha/api.jshttps://challenges.cloudflare.com/turnstile/v0/api.js
Element<div class="g-recaptcha" data-sitekey><div class="cf-turnstile" data-sitekey>
Token-Feldg-recaptcha-responsecf-turnstile-response
Verifizierungs-URLhttps://www.google.com/recaptcha/api/siteverifyhttps://challenges.cloudflare.com/turnstile/v0/siteverify
Verifizierungsparametersecret, response, remoteipsecret, response, remoteip, idempotency_key
<form action="/api/contact" method="POST">
  <input name="email" type="email" required />
  <textarea name="message" required></textarea>
  <div class="g-recaptcha" data-sitekey="RECAPTCHA_SITE_KEY"></div>
  <button>Send</button>
</form>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
const form = await request.formData();
const body = new URLSearchParams({
  secret: process.env.RECAPTCHA_SECRET_KEY!,
  response: String(form.get("g-recaptcha-response") ?? ""),
});
const check = await fetch("https://www.google.com/recaptcha/api/siteverify", { method: "POST", body });
const { success } = (await check.json()) as { success: boolean };
  • Das gilt für klassische reCAPTCHA-Schlüssel, die bei siteverify verifiziert werden. In Google Cloud erstellte Schlüssel werden stattdessen über die Assessments-API von reCAPTCHA Enterprise geprüft; die Turnstile-Seite ist dieselbe.
  • Wenn du v3 genutzt hast, entferne deine Score-Schwelle. Turnstile antwortet mit bestanden oder nicht bestanden; prüfe stattdessen action in seiner Antwort.
  • Aktualisiere deine Content Security Policy: Erlaube https://challenges.cloudflare.com in script-src und frame-src und entferne die Google-Einträge, sobald nichts sie mehr nutzt.
  • Liefere Markup und Serveränderung im selben Deployment aus. Eine Seite mit dem neuen Widget, die an einen Server sendet, der noch g-recaptcha-response erwartet, lässt jede Einsendung scheitern.

reCAPTCHA durch Ikiform ersetzen

Wenn dein Formular an Ikiform sendet, entferne das reCAPTCHA-Widget komplett. Ikiform verifiziert keine reCAPTCHA- oder hCaptcha-Tokens. Der übrig gebliebene Wert g-recaptcha-response käme als zusätzliches Feld an oder würde mit 422 validation_failed als unbekanntes Feld scheitern, wenn du die Felder des Formulars definiert hast. Wähle dann, was es ersetzt:

  • Nichts weiter. Honeypot, Inhaltsbewertung und Rate-Limits laufen bei jedem Formular. Viele Kontaktformulare brauchen nicht mehr.
  • Spamprüfung auf Ikiform. Cloudflare Turnstile, von Ikiform ausgeführt, ohne Konto oder Schlüssel. Ein einfacher HTML-Post bekommt eine kurze Prüfseite; fetch-Code ruft challenge() aus @ikiform/sdk auf.
  • Eigene Turnstile-Schlüssel. Behalte dein eigenes Widget auf der Seite, füge die Schlüssel in die Einstellungen des Formulars ein, und Ikiform verifiziert das Token.
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="POST">
  <input name="email" type="email" required />
  <textarea name="message" required></textarea>
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
  <button>Send</button>
</form>

Dieses Formular hat gar kein Widget. Mit Spam check auf Ikiform findet die Menschlichkeitsprüfung nach dem Post auf ikiform.com statt, deine Seite lädt also kein Captcha-Skript. Die Spam-Dokumentation behandelt jeden Modus.

Wenn du gleichzeitig von einem gehosteten Formulardienst wegwechselst, behandeln die Vergleichsseiten zu Formspree und Netlify Forms, was sich sonst noch ändert.

Prüfen, ob es funktioniert

  1. Sende das Formular nach dem Wechsel ab. Der Post wird angenommen, und du hast höchstens eine Checkbox gesehen.
  2. Sende mit curl ohne Token an den Endpunkt. Er wird abgelehnt, was beweist, dass der Server das neue Token prüft.
  3. Durchsuche deine Seiten nach g-recaptcha und recaptcha/api.js. Nichts ist übrig.
  4. Öffne Submissions im Dashboard. Die neue Einsendung ist da, mit jedem Feld, das du gesendet hast.
  5. Nichts angekommen? Stell den Statusfilter im Dashboard auf Spam. Spam bekommt dieselbe Erfolgsantwort wie eine echte Einsendung.

Stolperfallen

  • Baukasten-Einstellungen. Website-Baukästen mit eingebauter reCAPTCHA-Einstellung verlangen das Element eventuell in jedem Formular, solange sie aktiv ist. Schalte die Einstellung aus, bevor du die Elemente entfernst.
  • Gecachte Seiten. Besucher mit einer alten gecachten Seite senden nach dem Deployment noch eine Weile g-recaptcha-response. Rechne mit ein paar Fehlschlägen oder akzeptiere einen Tag lang beide Tokens.
  • v3-Scores in Berichten. Wenn Dashboards oder Alerts den reCAPTCHA-Score lesen, verstummen sie nach dem Wechsel. Aktualisiere sie.

Fragen

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