Cloudflare Turnstile
et CapMonster Cloud

Résolution de CAPTCHA, installation sur le site web et tests.

Tarifs de la solution Cloudflare Turnstile

CAPTCHA
Prix (USD)
$ 1.30
1000 jetons
Vous avez hérité d’un site doté d’une captcha ou d’une autre couche de protection mais sans accès au code source ? Il est alors naturel de se demander quelle solution est installée, si elle est correctement configurée et comment la tester.

Dans cet article, nous avons essayé de répondre à toutes les questions essentielles. Pour commencer à résoudre le problème, il faut d’abord déterminer quel système de protection est utilisé. Pour cela, vous pouvez consulter la liste des captchas et systèmes de protection antibot les plus populaires, qui présente des exemples visuels et des caractéristiques clés permettant d’identifier rapidement avec quoi vous avez affaire.

Si vous constatez que votre site utilise Cloudflare Turnstile, l’étape suivante consiste à étudier plus en détail ses propriétés et son fonctionnement. Dans cet article, vous pouvez également consulter le guide d’intégration de Cloudflare Turnstile afin de comprendre pleinement la façon dont il fonctionne sur votre site. Cela vous permettra non seulement de mieux connaître la protection en place, mais aussi de planifier correctement sa maintenance.

Qu'est-ce que Cloudflare Turnstile
Qu'est-ce que Cloudflare Turnstile
Cloudflare Turnstile est un CAPTCHA moderne de Cloudflare qui protège les sites web contre les actions automatisées. Pour les visiteurs du site web, la vérification est presque invisible, il n'est pas nécessaire de compléter des tâches : un simple clic sur la case à cocher suffit généralement, après quoi le système décide de laisser passer le visiteur ou de le bloquer en cas de suspicion de bot. Contrairement à Cloudflare Challenge, le CAPTCHA Turnstile est placé directement sur le site web, et non dans une fenêtre séparée, généralement dans les formulaires de connexion ou d'inscription.

Comment résoudre Cloudflare Turnstile via CapMonster Cloud

Lors des tests de formulaires contenant Cloudflare Turnstile, il est souvent nécessaire de vérifier que la captcha fonctionne et qu’elle est correctement intégrée.

Vous pouvez contrôler manuellement la captcha intégrée à votre site.

  • Ouvrez la page du formulaire et vérifiez que la captcha s’affiche.
  • Essayez d’envoyer le formulaire sans la résoudre — le serveur doit renvoyer une erreur.
  • Après une résolution réussie, l’envoi doit se faire sans problème.

Pour une résolution automatique, utilisez des outils comme CapMonster Cloud qui reçoivent les paramètres de la captcha, les traitent sur leurs serveurs et renvoient un jeton prêt à l’emploi. Insérez ce jeton dans le formulaire pour passer la vérification sans interaction utilisateur.

Travailler avec CapMonster Cloud via l’API comprend généralement les étapes suivantes :

Création de la tâcheCréation de la tâche
arrow
Envoyer une requête APIEnvoyer une requête API
arrow
Réception du résultatRéception du résultat
arrow
Insertion du jeton sur la pageInsertion du jeton sur la page
arrow
Reconnaissance de Cloudflare Turnstile avec des bibliothèques prêtes à l'emploi
Le service CapMonster Cloud fournit des bibliothèques prêtes à l'emploi pour un travail pratique dans les langages Python, JavaScript (Node.js) et C#.
Python
JavaScript
C#
Résolution, insertion de token et soumission de formulaire
Exemple en Node.js pour le cycle complet de reconnaissance de CAPTCHA sur votre page web. Approches possibles : utiliser des requêtes HTTP pour obtenir le HTML et les paramètres du CAPTCHA, envoyer la réponse et traiter le résultat ; ou avec des outils d'automatisation (par exemple, Playwright) : ouvrir la page, attendre le CAPTCHA, envoyer les paramètres (pour les tests, vous pouvez envoyer des données correctes et incorrectes), obtenir la solution via le client CapMonster Cloud, insérer le token dans le formulaire et voir le résultat.
python
// npm install playwright @zennolab_com/capmonstercloud-client

import { chromium } from "playwright";
import { CapMonsterCloudClientFactory, ClientOptions, TurnstileRequest } from "@zennolab_com/capmonstercloud-client";

async function main() {
  // 1. Résolution de Turnstile via CapMonster Cloud
  const cmcClient = CapMonsterCloudClientFactory.Create(
    new ClientOptions({ clientKey: 'YOUR_CAPMONSTER_API_KEY' })
  );

  const turnstileRequest = new TurnstileRequest({
    websiteURL: 'http://tsmanaged.zlsupport.com',
    websiteKey: '0x4AAAAAAABUYP0XeMJF0xoy',
  });

  const result = await cmcClient.Solve(turnstileRequest);
  const token = result.solution.token;
  console.log('Token Turnstile reçu :', token);

  // 2. Démarrage de Playwright
  const browser = await chromium.launch({ headless: false });
  const context = await browser.newContext();
  const page = await context.newPage();
  await page.goto('http://tsmanaged.zlsupport.com');

  // 3. Remplissage du login et du mot de passe
  await page.fill('#username', 'your_username');
  await page.fill('#password', 'your_password');

  // 4. Attente de l'apparition du champ de token caché
  await page.waitForSelector('#token', { state: 'attached', timeout: 60000 });

  // 5. Insertion du token et rendre le champ visible
  await page.evaluate((t) => {
    const tokenInput = document.querySelector('#token');
    if (tokenInput) {
      tokenInput.type = 'text';  // rendre le champ visible
      tokenInput.value = t;      // insérer le token
      console.log('Token inséré dans le champ token');
    } else {
      console.error('Champ #token non trouvé');
    }
  }, token);

  // 6. Vérifier que le token a bien été inséré
  const checkValue = await page.$eval('#token', el => el.value);
  console.log('Vérification de la valeur du token :', checkValue);

  // 7. Soumettre le formulaire
  await page.click('button[type="submit"]');
  console.log('Formulaire soumis avec le token Turnstile');

  // await browser.close();
}

main().catch(err => console.error(err));
Comment connecter Cloudflare Turnstile à votre site web
Pour naviguer en toute confiance dans le fonctionnement du CAPTCHA sur votre site web, comprendre la logique de sa vérification, le reconnecter ou le reconfigurer, nous vous recommandons d'étudier cette section. Elle décrit le processus de connexion de la protection, ce qui vous aidera à comprendre rapidement toutes les nuances.

1. Accédez à la page Cloudflare Turnstile, cliquez sur Commencer maintenant.

2. Inscrivez-vous au service.

3. Dans Turnstile Widgets, cliquez sur le bouton bleu Add Widget.

HowTo Connect image 1

4. Configurez Cloudflare Turnstile, spécifiez :

  • Widget name : nom du CAPTCHA (pour la commodité, par exemple Login form).
  • Hostname Management : domaines où le CAPTCHA fonctionnera (par exemple, example.com).
  • Widget Mode :
    • Managed : option optimale, le CAPTCHA décide lui-même s'il faut afficher la case à cocher.
    • Non-interactive : la vérification est effectuée automatiquement sans clics.
    • Invisible : complètement invisible.
  • Pre-clearance : définissez sur Yes si le site passe par Cloudflare Proxy (pour éviter de répéter le CAPTCHA).

5. Après avoir créé le widget, vous recevrez deux clés : Site Key et Secret Key.

HowTo Connect image 2

6. Connecter la partie cliente

1) Connecter le script Turnstile

Rendu automatique (le widget est créé automatiquement lors du chargement de la page) :

markup
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>

Contrôle programmatique (vous créez vous-même le widget via JavaScript) :

markup
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit" defer></script>

Important : le script doit être chargé à partir de l'URL exacte. Le proxy ou le cache peuvent causer des échecs.

2) Créer un conteneur pour le widget

Automatique :

markup
<div class="cf-turnstile" data-sitekey="<YOUR_SITEKEY>"></div>

Par programmation :

markup
<div id="turnstile-container"></div>

3) Configuration du widget

Via les attributs data :

markup
<div class="cf-turnstile"
            data-sitekey="<YOUR_SITEKEY>"
            data-theme="light"
            data-size="normal"
            data-callback="onSuccess">
          </div>

Via JavaScript :

javascript
const widgetId = turnstile.render("#turnstile-container", {
  sitekey: "<YOUR_SITEKEY>",
  theme: "light",
  size: "normal",
  callback: token => console.log("Token:", token)
});

4) Travail avec les tokens

javascript
const token = turnstile.getResponse(widgetId);      // obtenir le token
const isExpired = turnstile.isExpired(widgetId);    // vérifier l'expiration
turnstile.reset(widgetId);                          // réinitialiser
turnstile.remove(widgetId);                         // supprimer
turnstile.execute("#turnstile-container");         // exécution manuelle

5) Intégration avec le formulaire

markup
<form id="my-form" method="POST">
  <input type="hidden" name="cf-turnstile-response" id="cf-turnstile-response">
  <button type="submit">Soumettre</button>
</form>

<script>
function onSuccess(token) {
  document.getElementById("cf-turnstile-response").value = token;
}
</script>

Exemple de codeExemple de code
arrow

6) Configurer la partie serveur

Processus de vérification côté serveur :

  • Client : l'utilisateur complète Turnstile sur la page → le token est créé.
  • Le formulaire est soumis : le token avec les données du formulaire est envoyé au serveur.
  • Serveur : effectue une requête POST à l'API Siteverify de Cloudflare avec le token et le secret.
  • Cloudflare : renvoie un JSON avec le résultat (success: true/false) et des informations supplémentaires (action, hostname, temps de complétion).
  • Serveur : décide d'autoriser ou de rejeter l'action de l'utilisateur.

API Siteverify :

javascript
POST
https://challenges.cloudflare.com/turnstile/v0/siteverify

Paramètres de la requête :

  • secret (obligatoire) : clé secrète Turnstile du panneau Cloudflare
  • response (obligatoire) : token reçu sur le client
  • remoteip (optionnel) : adresse IP de l'utilisateur (recommandé)
  • idempotency_key (optionnel) : UUID unique pour la protection contre les vérifications répétées

Propriétés du token :

  • Longueur maximale : 2048 caractères
  • Valide pendant 5 minutes
  • À usage unique
  • En cas d'expiration ou de nouvelle vérification, l'API renverra l'erreur timeout-or-duplicate

Exemple de vérification en PHPExemple de vérification en PHP
arrow

Background
Erreurs possibles et débogage
Bug Icon
Paramètres incorrects
Le CAPTCHA ne s'affiche pas ou renvoie des erreurs comme invalid-input-secret, missing-input-response, invalid-input-response. Vérifiez la validité de sitekey et secret key, ainsi que les paramètres dans le tableau de bord Cloudflare.
Bug Icon
Délai de résolution dépassé
Le token a expiré (valide pendant 300 secondes) ou n'a pas été reçu à temps. Assurez une connexion stable et une intégration API correcte.
Bug Icon
Token vide ou incorrect
Le paramètre cf-turnstile-response est manquant ou incorrect. Vérifiez le transfert du token au formulaire et au serveur.
Bug Icon
Réponse success=false
Le token est invalide, expiré ou déjà utilisé. Chaque token ne peut être vérifié qu'une seule fois. Activez la journalisation des requêtes et réponses Siteverify pour l'analyse.
Tests de robustesse de la protection
Après l’intégration, vérifiez que le système protège réellement le site contre les actions automatisées.
Conseils de sécurité et d’optimisation
Vérifiez les tokens uniquement sur le serveur, n'appelez jamais l'API Siteverify depuis le frontend : cela exposera votre clé secrète.
Utilisez des variables d'environnement ou un système de gestion des secrets plutôt que de stocker les clés dans le code.
Vérifiez les champs supplémentaires (<span class="font-bold">hostname</span>, <span class="font-bold">action</span>) pour vous assurer que la requête provient de votre site web.
Utilisez HTTPS : tous les appels à Siteverify doivent être effectués via une connexion sécurisée.
Implémentez la gestion des erreurs : lorsque l'API n'est pas disponible, affichez un message clair à l'utilisateur sans révéler de données internes.
Restreignez l'utilisation de la sitekey par domaines.
Ajoutez des liens vers la <span class="font-bold">Politique de confidentialité</span> et les <span class="font-bold">Conditions d'utilisation de Cloudflare</span> au formulaire si votre organisation ou votre politique de confidentialité l'exige.
Conclusion

Si vous avez récupéré un site avec un captcha ou un autre système de protection déjà installé, mais sans accès au code, pas de panique ! Il est assez simple d’identifier quelle technologie est utilisée. Pour vérifier que tout fonctionne correctement, vous pouvez utiliser le service de reconnaissance CapMonster Cloud dans un environnement de test isolé, afin de vous assurer que le mécanisme de traitement des jetons et la logique de vérification fonctionnent correctement.

Dans le cas de Cloudflare Turnstile, il suffit d’identifier le système, d’étudier son comportement et de vérifier que la protection fonctionne correctement. Dans cet article, nous avons montré comment reconnaître Cloudflare Turnstile et où trouver les instructions pour son intégration ou sa reconfiguration, afin de maintenir la protection en toute confiance et de garder son fonctionnement sous contrôle.

Conclusion

Questions fréquentes sur Cloudflare Turnstile

Pour résoudre Cloudflare Turnstile avec CapMonster Cloud :

Envoyez une requête POST à https://api.capmonster.cloud/createTask avec les paramètres JSON suivants :

json
{
  "clientKey": "API_KEY",
  "task": {
    "type": "TurnstileTask",
    "websiteURL": "[page_URL_with_Turnstile]",
    "websiteKey": "[Turnstile_website_key]"
  }
}
  • clientKey : Votre clé API CapMonster Cloud
  • task.type : TurnstileTask
  • task.websiteURL : L'URL de la page où le captcha est résolu
  • task.websiteKey : Clé Turnstile site key. Voir comment la trouver.

L'API renvoie un taskId.

Interrogez https://api.capmonster.cloud/getTaskResult avec clientKey et taskId jusqu'à ce que le statut de la réponse devienne ready.

Lorsque la tâche est résolue, la réponse inclut un token et le userAgent correspondant.

Transmettez les deux valeurs à la même session de navigateur qui soumettra le formulaire.

Consultez la documentation de la tâche Turnstile pour plus de détails et d'exemples.

Cloudflare Turnstile prend en charge trois modes de widget :

  • Managed : Turnstile décide d'afficher une vérification interactive ou de laisser passer le visiteur silencieusement selon le risque.
  • Non-interactive : Fonctionne sans interaction utilisateur mais affiche toujours un widget visible pendant les vérifications.
  • Invisible : Fonctionne également sans interaction utilisateur, mais le widget n'est pas affiché au visiteur.

Une fois que votre backend reçoit le token Turnstile du client :

Envoyez-le par POST à https://challenges.cloudflare.com/turnstile/v0/siteverify avec les paramètres :

  • secret : La clé secrète de votre widget depuis le tableau de bord Cloudflare
  • response : Le token du widget côté client
  • remoteip (facultatif) : L'adresse IP du visiteur
  • idempotency_key (facultatif) : Un UUID que vous générez pour réessayer la validation en toute sécurité

L'endpoint accepte à la fois application/x-www-form-urlencoded et application/json.

Si le token a été vérifié avec succès, Cloudflare renvoie success: true.

Utilisez page.evaluate() ou une autre méthode au niveau du DOM pour injecter le token dans le champ avec [name="cf-turnstile-response"] avant la soumission du formulaire.

Gardez à l'esprit que certaines intégrations s'appuient également sur des callbacks ou des gestionnaires JavaScript personnalisés. Dans ce cas, appelez la fonction de callback JS du widget (définie dans data-callback) et transmettez le token reçu à la vérification serveur.

L'erreur timeout-or-duplicate de Turnstile siteverify signifie généralement que le token a expiré avant la vérification ou a été soumis plus d'une fois. Les tokens Turnstile sont à usage unique et expirent après cinq minutes.

Pour le débogage des erreurs :

  • Activez la journalisation des requêtes vers https://challenges.cloudflare.com/turnstile/v0/siteverify
  • Comparez l'heure de création du token avec l'heure de vérification.
  • Vérifiez si votre backend vérifie le même token deux fois, par exemple lors de nouvelles tentatives, de redirections ou du traitement de requêtes en double.