Arrêter le spam des formulaires de contact

Arrêter le spam des formulaires de contact7 min de lecture

Alternatives à reCAPTCHA pour les formulaires de site web

Comparez les alternatives à reCAPTCHA pour formulaires, de Turnstile et hCaptcha à la preuve de travail ou à l'absence de captcha, puis migrez avec un petit changement sûr.

Preet SutharFondateur, Ikiform

Cloudflare Turnstile est le remplaçant le plus proche de reCAPTCHA : il est surtout invisible, suit le même schéma site key et clé secrète, et sa vérification serveur prend les mêmes paramètres. hCaptcha convient aux sites qui veulent des défis en images fournis par quelqu'un d'autre que Google, et les outils de preuve de travail comme ALTCHA fonctionnent sans aucun tiers. Pour beaucoup de formulaires de contact, un honeypot, un score du contenu et une limite de débit rendent un captcha inutile.

Pourquoi quitter reCAPTCHA

reCAPTCHA fonctionne toujours. Les raisons de le remplacer tiennent surtout au coût pour les visiteurs et pour vous. La version 2 montre des puzzles d'images à certains visiteurs, ce qui est lent sur téléphone et difficile pour les personnes qui utilisent un lecteur d'écran. La version 3 est invisible mais renvoie un score auquel vous devez fixer vous-même un seuil, sans défi de repli. Et reCAPTCHA est désormais un produit Google Cloud : la documentation de facturation de Google indique une franchise gratuite de 10 000 évaluations par mois, avec des paliers payants au-delà.

Certaines équipes veulent aussi moins de scripts tiers sur leurs pages. Savoir si cela compte pour vos obligations en matière de confidentialité relève de votre propre analyse juridique ; cette page compare seulement le fonctionnement des outils.

Les alternatives comparées

OptionCe que voient les visiteursQui vérifieBon à savoir
reCAPTCHA v2Une case à cocher, parfois des puzzles d'imagesVotre serveur, avec GoogleFamilier. Les puzzles sont le principal grief
reCAPTCHA v3RienVotre serveur, avec GoogleRenvoie un score de 0,0 à 1,0. Vous choisissez le seuil et gérez la zone grise
Cloudflare TurnstileGénéralement rien, parfois une case à cocherVotre serveur, avec CloudflarePas de puzzles d'images. Gratuit jusqu'à 20 widgets
hCaptchaUne case à cocher, parfois des puzzles d'imagesVotre serveur, avec hCaptchaProche de reCAPTCHA v2 dans sa forme, par une autre entreprise. Une offre Basic gratuite, avec des offres Pro et Enterprise payantes
Friendly CaptchaUn petit widget qui résout un puzzle en arrière-planVotre serveur, avec Friendly CaptchaPreuve de travail plutôt que signaux de suivi. Gratuit pour les petits sites non commerciaux, offres payantes pour tous les autres
ALTCHAUn petit widget qui résout un puzzle en arrière-planVotre propre serveur uniquementOpen source et auto-hébergé, donc sans tiers. Vous le faites tourner et le maintenez
No captchaRienVotre serveurHoneypot, délai signé, score du contenu et limites de débit. Arrête la plupart des bots, pas tous

Toutes les options sauf la dernière dépendent encore d'une vérification côté serveur. Un widget seul n'arrête rien, car un bot peut envoyer vers votre endpoint sans charger la page.

Ce que chaque option demande aux personnes

Jugez chaque option selon le visiteur pour qui elle est la plus difficile. Les puzzles d'images sont lents sur téléphone et difficiles, voire impossibles, pour quelqu'un qui voit mal ; les alternatives audio aident certaines personnes et en agacent d'autres. Les vérifications invisibles, comme le mode habituel de Turnstile, reCAPTCHA v3 et les widgets de preuve de travail, ne demandent rien à la plupart des visiteurs, mais peuvent quand même échouer pour les personnes sur des navigateurs axés sur la confidentialité, des réseaux stricts ou des appareils anciens. Dans ce cas, la personne a besoin d'une issue : une case à cocher visible, un message clair, ou une adresse e-mail où écrire à la place. Un formulaire qui échoue en silence perd précisément les messages dont vous n'entendez jamais parler.

Choisir en deux questions

Choisir un remplaçant à reCAPTCHA en deux questionsCommencez iciPas de serveur : un site statique ou un créateur de sitesdes botspassent-ilsles vérifsinvisibles ?pouvez-vousexécuter ducodeserveur ?votre proprewidgetTurnstile, hCaptcha ouALTCHArester sanscaptchahoneypot, score, limitede débitenvoi vers unbackendle backend vérifievos clésTurnstile uniquement,avec Ikiformou une vérif. géréeaucune cléouiouinonChoisir un remplaçant à reCAPTCHA en deux questionsCommencez iciPas de serveur : un site statique ou un créateur de sitesdes botspassent-ilsles vérifsinvisibles ?pouvez-vousexécuter ducodeserveur ?votre proprewidgetTurnstile, hCaptchaou ALTCHArestersanscaptchahoneypot,score,limite dedébitenvoi vers unbackendle backendvérifie vosclésTurnstileuniquement, avecIkiformou une vérif.géréeaucune cléouiouinon
  1. Demandez-vous d'abord si des bots passent les vérifications invisibles. Si ce n'est pas le cas, restez sans captcha avec un honeypot, un score et une limite de débit.
  2. Si c'est le cas, demandez-vous si vous pouvez exécuter du code serveur. Si oui, choisissez un widget comme Turnstile, hCaptcha ou ALTCHA et vérifiez-le sur votre serveur.
  3. Sans serveur, envoyez le formulaire à un backend qui vérifie vos clés Turnstile pour vous, ou utilisez une vérification gérée qui ne demande aucune clé.
La plupart des formulaires de contact s'arrêtent à la première question. Mesurez votre spam avant d'ajouter le moindre widget.

Passer de reCAPTCHA à Turnstile

Les deux sont assez proches pour que la migration tienne en quelques lignes de chaque côté. Créez un widget Turnstile dans le tableau de bord Cloudflare pour les mêmes hostnames, puis changez le balisage et la vérification serveur en même temps.

ÉlémentreCAPTCHA v2Turnstile
Scripthttps://www.google.com/recaptcha/api.jshttps://challenges.cloudflare.com/turnstile/v0/api.js
Élément HTML<div class="g-recaptcha" data-sitekey><div class="cf-turnstile" data-sitekey>
Champ du tokeng-recaptcha-responsecf-turnstile-response
URL de vérificationhttps://www.google.com/recaptcha/api/siteverifyhttps://challenges.cloudflare.com/turnstile/v0/siteverify
Paramètres de vérificationsecret, 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 };
  • Cela couvre les clés reCAPTCHA classiques, vérifiées via siteverify. Les clés créées dans Google Cloud se vérifient plutôt via l'API d'évaluations de reCAPTCHA Enterprise ; le côté Turnstile est identique.
  • Si vous utilisiez la v3, retirez votre seuil de score. Turnstile répond réussite ou échec ; vérifiez plutôt action dans sa réponse.
  • Mettez à jour votre Content Security Policy : autorisez https://challenges.cloudflare.com dans script-src et frame-src, et retirez les entrées Google une fois que plus rien ne les utilise.
  • Livrez le balisage et le changement serveur dans un seul déploiement. Une page avec le nouveau widget qui envoie vers un serveur attendant encore g-recaptcha-response fait échouer chaque envoi.

Remplacer reCAPTCHA avec Ikiform

Si votre formulaire envoie vers Ikiform, retirez complètement le widget reCAPTCHA. Ikiform ne vérifie pas les tokens reCAPTCHA ni hCaptcha. La valeur g-recaptcha-response restante arriverait comme un champ en trop, ou échouerait avec 422 validation_failed comme champ inconnu si vous avez défini les champs du formulaire. Choisissez ensuite ce qui le remplace :

  • Rien de plus. Le honeypot, le score du contenu et les limites de débit s'exécutent sur chaque formulaire. Beaucoup de formulaires de contact n'ont besoin de rien d'autre.
  • Spam check réglé sur Ikiform. Cloudflare Turnstile, exécuté par Ikiform, sans compte ni clés. Un envoi HTML simple reçoit une courte page de vérification ; le code fetch appelle challenge() de @ikiform/sdk.
  • Vos propres clés Turnstile. Gardez votre propre widget sur la page, collez les clés dans les réglages du formulaire, et Ikiform vérifie le 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>

Ce formulaire n'a aucun widget. Avec Spam check réglé sur Ikiform, la vérification humaine a lieu sur ikiform.com après l'envoi : votre page ne charge donc aucun script de captcha. La documentation sur le spam couvre chaque mode.

Si vous quittez en même temps un service de formulaires hébergé, les pages de comparaison pour Formspree et Netlify Forms couvrent ce qui change d'autre.

Vérifiez que tout fonctionne

  1. Envoyez le formulaire après la migration. L'envoi est accepté et vous avez vu tout au plus une case à cocher.
  2. Envoyez vers l'endpoint avec curl et sans token. L'envoi est refusé, ce qui prouve que le serveur vérifie le nouveau token.
  3. Cherchez g-recaptcha et recaptcha/api.js dans vos pages. Il n'en reste rien.
  4. Ouvrez Submissions dans le tableau de bord. La nouvelle soumission y est, avec tous les champs envoyés.
  5. Rien n'est arrivé ? Passez le filtre de statut du tableau de bord sur Spam. Le spam reçoit la même réponse de succès qu'une vraie soumission.

Pièges

  • Réglages des créateurs de sites. Les créateurs de sites avec un réglage reCAPTCHA intégré peuvent exiger l'élément sur chaque formulaire tant qu'il est activé. Désactivez le réglage avant de retirer les éléments.
  • Pages en cache. Les visiteurs avec une ancienne page en cache envoient encore g-recaptcha-response pendant un moment après votre déploiement. Attendez-vous à quelques échecs, ou acceptez les deux tokens pendant une journée.
  • Scores v3 dans les rapports. Si des tableaux de bord ou des alertes lisent le score reCAPTCHA, ils deviennent muets après la migration. Mettez-les à jour.

Questions

Une étape vous bloque, ou vous voulez un guide pour votre cas ? Écrivez à hello@ikiform.com.