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.
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
| Option | Ce que voient les visiteurs | Qui vérifie | Bon à savoir |
|---|---|---|---|
| reCAPTCHA v2 | Une case à cocher, parfois des puzzles d'images | Votre serveur, avec Google | Familier. Les puzzles sont le principal grief |
| reCAPTCHA v3 | Rien | Votre serveur, avec Google | Renvoie un score de 0,0 à 1,0. Vous choisissez le seuil et gérez la zone grise |
| Cloudflare Turnstile | Généralement rien, parfois une case à cocher | Votre serveur, avec Cloudflare | Pas de puzzles d'images. Gratuit jusqu'à 20 widgets |
| hCaptcha | Une case à cocher, parfois des puzzles d'images | Votre serveur, avec hCaptcha | Proche de reCAPTCHA v2 dans sa forme, par une autre entreprise. Une offre Basic gratuite, avec des offres Pro et Enterprise payantes |
| Friendly Captcha | Un petit widget qui résout un puzzle en arrière-plan | Votre serveur, avec Friendly Captcha | Preuve de travail plutôt que signaux de suivi. Gratuit pour les petits sites non commerciaux, offres payantes pour tous les autres |
| ALTCHA | Un petit widget qui résout un puzzle en arrière-plan | Votre propre serveur uniquement | Open source et auto-hébergé, donc sans tiers. Vous le faites tourner et le maintenez |
| No captcha | Rien | Votre serveur | Honeypot, 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
- 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.
- 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.
- 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é.
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ément | reCAPTCHA v2 | Turnstile |
|---|---|---|
| Script | https://www.google.com/recaptcha/api.js | https://challenges.cloudflare.com/turnstile/v0/api.js |
| Élément HTML | <div class="g-recaptcha" data-sitekey> | <div class="cf-turnstile" data-sitekey> |
| Champ du token | g-recaptcha-response | cf-turnstile-response |
| URL de vérification | https://www.google.com/recaptcha/api/siteverify | https://challenges.cloudflare.com/turnstile/v0/siteverify |
| Paramètres de vérification | secret, response, remoteip | secret, 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
actiondans sa réponse. - Mettez à jour votre Content Security Policy : autorisez
https://challenges.cloudflare.comdansscript-srcetframe-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-responsefait é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
fetchappellechallenge()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.
Vérifiez que tout fonctionne
- Envoyez le formulaire après la migration. L'envoi est accepté et vous avez vu tout au plus une case à cocher.
- Envoyez vers l'endpoint avec curl et sans token. L'envoi est refusé, ce qui prouve que le serveur vérifie le nouveau token.
- Cherchez
g-recaptchaetrecaptcha/api.jsdans vos pages. Il n'en reste rien. - Ouvrez Submissions dans le tableau de bord. La nouvelle soumission y est, avec tous les champs envoyés.
- 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-responsependant 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
Pour la plupart des formulaires, Cloudflare Turnstile : il est généralement invisible, ne coûte rien à petite échelle et se vérifie avec les mêmes paramètres secret et response. Si vous ne voulez aucun tiers, un outil de preuve de travail auto-hébergé comme ALTCHA fonctionne. Beaucoup de formulaires de contact n'ont besoin d'aucun captcha une fois un honeypot, un score et une limite de débit en place.
La documentation de facturation de Google indique une franchise gratuite de 10 000 évaluations par mois, avec des paliers payants au-delà. Consultez les tarifs actuels de Google avant de planifier autour.
Non. Ikiform vérifie uniquement Cloudflare Turnstile, soit sa propre vérification gérée, soit vos propres clés Turnstile. Retirez les autres widgets de captcha des formulaires qui envoient vers Ikiform.
En général, non. Vous changez l'URL du script, la classe de l'élément, le nom du champ du token et l'URL de vérification, et gardez les mêmes paramètres secret et response. Déployez la page et le changement serveur ensemble.
Une étape vous bloque, ou vous voulez un guide pour votre cas ? Écrivez à hello@ikiform.com.