logo
bars

ALTCHA
et CapMonster Cloud

Résolution de captcha, installation sur le site et tests.
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 ALTCHA, 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 ALTCHA 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 qu'ALTCHA
Qu'est-ce qu'ALTCHA
ALTCHA (Alternative CAPTCHA) est un système de protection de sites web contre les bots et le spam. Il aide à distinguer les utilisateurs réels des programmes automatisés afin que le site fonctionne de manière sûre et stable. ALTCHA est une alternative moderne aux CAPTCHAs classiques : il utilise un challenge cryptographique léger (proof-of-work) et ne collecte pas de cookies ni ne suit les utilisateurs.
Background
Exemples de ALTCHA
Proof-of-Work (PoW)
Proof-of-Work (PoW)
Le système utilise par défaut la vérification Proof-of-Work (PoW), ce qui élimine les puzzles visuels et les contrôles intrusifs. Cette approche combine sécurité et confort pour l'utilisateur, offrant une solution captcha discrète adaptée à la plupart des visiteurs.
Code Captcha
Code Captcha
La protection peut être renforcée jusqu'à la saisie d'un captcha texte.
Invisible Captcha
Invisible Captcha
La vérification se fait sans widget visible et ne nécessite aucune action de l'utilisateur.

Comment résoudre ALTCHA via CapMonster Cloud

Lors des tests de formulaires contenant ALTCHA, 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
Résolution, insertion du token et soumission du formulaire
Exemple en Node.js pour un cycle complet de résolution de captcha sur votre site 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 utiliser des outils d'automatisation (ex : Playwright) — ouvrir la page, attendre le captcha, envoyer les paramètres (pour tester, vous pouvez envoyer des valeurs correctes ou incorrectes), obtenir le résultat via le client CapMonster Cloud, insérer le token dans le formulaire et observer le résultat.
// npm install playwright
// npx playwright install chromium

const { chromium } = require("playwright");

const API_KEY = "YOUR_API_KEY";
const ALTCHA_PAGE = "https://example.com"; // Votre site avec ALTCHA

(async () => {
  const browser = await chromium.launch({ headless: false, devtools: true });
  const context = await browser.newContext();
  const page = await context.newPage();

  // Capture de toutes les réponses de l'endpoint Altcha
  let challengeResp = null;
  page.on("response", async (response) => {
    try {
      const url = response.url();
      if (url.startsWith("https://captcha.example.com/altcha")) { // Endpoint Altcha
        challengeResp = await response.json();
        console.log("Captured Altcha response:", challengeResp);
      }
    } catch (err) {
      console.warn("Error parsing Altcha response:", err);
    }
  });

  await page.goto(ALTCHA_PAGE, { waitUntil: "networkidle" });

  // Cliquez sur le widget, s'il existe
  const widgetHandle = await page.$("altcha-widget");
  if (widgetHandle) {
    try {
      await widgetHandle.click();
    } catch {}
  }

  // En attente de l'apparition du challenge
  const start = Date.now();
  while (!challengeResp && Date.now() - start < 60000) { // Timeout augmenté
    await new Promise((r) => setTimeout(r, 300));
  }

  if (!challengeResp) {
    console.error("Failed to capture Altcha challenge.");
    await browser.close();
    return;
  }

  const { challenge, salt, signature, maxnumbers } = challengeResp;

  // Création d'une tâche sur CapMonster Cloud
  const createTaskBody = {
    clientKey: API_KEY,
    task: {
      type: "CustomTask",
      class: "altcha",
      websiteURL: ALTCHA_PAGE,
      websiteKey: "",
      userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36",
      metadata: {
        challenge,
        iterations: maxnumbers || 100000,
        salt,
        signature,
      },
    },
  };

  const taskResp = await fetch("https://api.capmonster.cloud/createTask", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(createTaskBody),
  }).then((r) => r.json());

  console.log("CreateTask response:", taskResp);
  if (!taskResp?.taskId) {
    console.error("CreateTask failed:", taskResp);
    await browser.close();
    return;
  }

  const taskId = taskResp.taskId;

  // Récupération de la solution
  let fullSolution = null;
  const pollStart = Date.now();
  while (Date.now() - pollStart < 120000) {
    const res = await fetch("https://api.capmonster.cloud/getTaskResult", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ clientKey: API_KEY, taskId }),
    }).then((r) => r.json());

    if (res.status === "ready") {
      fullSolution = res.solution;
      console.log("Solution:", fullSolution);
      break;
    }
    await new Promise((r) => setTimeout(r, 3000));
  }

  if (!fullSolution) {
    console.error("No solution received in time.");
    await browser.close();
    return;
  }

  const token = fullSolution?.data?.token || fullSolution?.token || fullSolution?.data;

  if (!token) {
    console.error("Token not found in solution:", fullSolution);
    await browser.close();
    return;
  }

  //Insertion du token
  await page.evaluate((t) => {
    let input = document.querySelector("#captchaParaValidar");
    if (!input) {
      input = document.createElement("input");
      input.type = "hidden";
      input.id = "captchaParaValidar";
      input.name = "captchaParaValidar";
      (document.querySelector("form") || document.body).appendChild(input);
    }
    input.value = t;

    let alt = document.querySelector('input[name="altcha"]');
    if (!alt) {
      alt = document.createElement("input");
      alt.type = "hidden";
      alt.name = "altcha";
      (document.querySelector("form") || document.body).appendChild(alt);
    }
    alt.value = t;

    const widget = document.querySelector("altcha-widget");
    if (widget) {
      widget.setAttribute("data-state", "verified");
      const checkbox = widget.querySelector("input[type='checkbox']");
      if (checkbox) {
        checkbox.checked = true;
        checkbox.dispatchEvent(new Event("change", { bubbles: true }));
      }
      const label = widget.querySelector(".altcha-label");
      if (label) label.textContent = "Verified";
    }
  }, token);

  console.log("Token injected:", token);
})();
Comment intégrer ALTCHA à votre site
Pour comprendre correctement le fonctionnement du captcha sur votre site, connaître sa logique de validation, le reconnecter ou le reconfigurer, nous vous recommandons de lire cette section. Elle décrit le processus d'intégration de la protection et vous aide à saisir rapidement tous les détails.

1. Installation du widget

Option 1 — via CDN (la plus simple). Ajoutez ceci dans le <head> de votre HTML :

<script async defer src="https://cdn.jsdelivr.net/gh/altcha-org/altcha/dist/altcha.min.js" type="module"></script>

Option 2 — via npm :

npm install altcha

Importez le widget dans votre fichier JS :

import "altcha";

2. Ajout du widget dans le formulaire.

Insérez le composant <altcha-widget> dans le formulaire nécessitant une protection :


<form method="POST" action="/submit">
  <altcha-widget challengeurl="/altcha/challenge"></altcha-widget>
  <button type="submit">Send</button>
</form>

challengeurl — votre endpoint serveur pour délivrer le challenge.

Si vous utilisez ALTCHA Sentinel (protection serveur prête à l'emploi contre bots et spam avec apprentissage automatique et analyse de trafic), utilisez son URL à la place de votre serveur :


<altcha-widget 
  challengeurl="https://sentinel.example.com/v1/challenge?apiKey=YOUR_API_KEY">
</altcha-widget>

3. Vérification côté serveur.

Comment se déroule la validation :

  • 1) Le widget génère un payload — JSON encodé en Base64, généralement envoyé comme champ de formulaire altcha.
  • 2) Sur le serveur, vous validez le payload de manière cryptographique (sans requêtes API supplémentaires).
  • 3) Après validation réussie, le formulaire peut être traité.

Validation via ALTCHA Sentinel :

Avec la bibliothèqueAvec la bibliothèque
arrow

Via l'API HTTP de Sentinel (si la bibliothèque n'est pas disponible) :Via l'API HTTP de Sentinel (si la bibliothèque n'est pas disponible) :
arrow

4. Validation sans Sentinel (serveur propre)

Génération du challenge :


import { createChallenge } from 'altcha-lib';

const hmacKey = '$ecret.key'; // Votre clé secrète HMAC

const challenge = await createChallenge({ hmacKey });

// Nous renvoyons le challenge en JSON pour le widget

Validation du payload lors de l'envoi du formulaire :


import { verifySolution } from 'altcha-lib';

const hmacKey = '$ecret.key'; // Votre clé secrète HMAC

const verified = await verifySolution(payload, hmacKey);

if (verified) {
  // Validation réussie — traitement des données du formulaire
}

Dans ce cas, vous créez vous-même l'endpoint /altcha/challenge pour délivrer les tâches et les vérifier côté serveur.

Background
Erreurs possibles et débogage
Bug Icon
challengeurl ou clé API invalide
Le widget ne se charge pas ou renvoie une erreur lors de la validation.
Bug Icon
Timeout de résolution
Le serveur n'a pas eu le temps de vérifier le payload. Augmentez le temps d'attente ou assurez-vous que la validation côté serveur fonctionne correctement.
Bug Icon
Payload vide
Erreur lors de l'envoi du résultat depuis le widget vers le serveur.
Bug Icon
Verification failed
Le payload est expiré, réutilisé ou falsifié. Pour le diagnostic, activez les logs et vérifiez les champs verified et verificationData dans la réponse du serveur ou Sentinel.
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
<b>Conservez les clés secrètes</b> (HMAC ou API Key pour Sentinel) uniquement sur le serveur — ne les envoyez pas au frontend.
<b>Consignez les erreurs</b> et les événements de vérification (<b>verified: false</b> et <b>verificationData</b>) pour comprendre les raisons des vérifications échouées.
Pour la transparence et la confiance des utilisateurs, <b>ajoutez des liens vers la politique de confidentialité</b> et les <b>conditions d'utilisation d'ALTCHA</b> si nécessaire.
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 ALTCHA, 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 ALTCHA 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
Liens utiles
DocIconDocumentation ALTCHADocIconCode source ALTCHADocIconDocumentation CapMonster Cloud (travail avec ALTCHA)