logo
bars

ALTCHA
en CapMonster Cloud

Captcha-oplossing, installatie op de website en testen.
Heb je een site geërfd met een ingebouwde captcha of andere bescherming, maar zonder toegang tot de broncode? Dan wil je natuurlijk weten welke oplossing draait, of die goed is ingesteld en hoe je de werking test.

In dit artikel hebben we geprobeerd antwoord te geven op alle belangrijke vragen. De eerste stap bij het oplossen van het vraagstuk is vaststellen welk beveiligingssysteem wordt gebruikt. Daarvoor kun je de lijst met populaire captcha’s en anti-botbeveiligingssystemen raadplegen, met visuele voorbeelden en kernkenmerken die je helpen snel te bepalen waarmee je te maken hebt.

Als je ontdekt dat je website ALTCHA gebruikt, is de volgende stap om de eigenschappen en werking ervan uitgebreider te bestuderen. In dit artikel vind je ook een handleiding voor het integreren van ALTCHA, zodat je volledig begrijpt hoe het systeem op je website werkt. Zo kun je niet alleen de huidige bescherming beter doorgronden, maar ook het onderhoud ervan goed plannen.

Wat is ALTCHA
Wat is ALTCHA
ALTCHA (Alternative CAPTCHA) is een systeem om websites te beschermen tegen bots en spam. Het helpt echte gebruikers te onderscheiden van geautomatiseerde programma's, zodat de site veilig en stabiel blijft werken. ALTCHA is een modern alternatief voor traditionele CAPTCHA: het gebruikt een lichte cryptografische uitdaging (proof-of-work) en verzamelt geen cookies of volgt gebruikers.
Background
Voorbeelden van ALTCHA
Proof-of-Work (PoW)
Proof-of-Work (PoW)
Het systeem gebruikt standaard de Proof-of-Work (PoW) verificatiemethode, waardoor visuele puzzels en opdringerige controles worden geëlimineerd. Deze aanpak combineert veiligheid met gebruiksgemak en biedt een subtiele captcha-oplossing geschikt voor de meeste bezoekers.
Code Captcha
Code Captcha
De bescherming kan worden versterkt tot het invullen van een tekstcaptcha.
Invisible Captcha
Invisible Captcha
De verificatie vindt plaats zonder zichtbaar widget en vereist geen handelingen van de gebruiker.

Hoe ALTCHA op te lossen via CapMonster Cloud

Bij het testen van formulieren met ALTCHA moet je vaak bevestigen dat de captcha goed is ingebouwd en werkt.

Je kunt de captcha op je site handmatig testen.

  • Open de pagina met het formulier en controleer of de captcha verschijnt.
  • Probeer het formulier te versturen zonder oplossing — de server hoort een fout terug te geven.
  • Na een succesvolle oplossing moet het formulier probleemloos worden verzonden.

Voor automatische oplossingen kun je tools zoals CapMonster Cloud gebruiken. Deze ontvangen de captcha-parameters, verwerken ze op hun servers en sturen een token terug dat je in het formulier kunt zetten om de controle zonder gebruikersinteractie te omzeilen.

Werken met CapMonster Cloud via de API bestaat doorgaans uit de volgende stappen:

Taak aanmakenTaak aanmaken
arrow
API-aanvraag versturenAPI-aanvraag versturen
arrow
Resultaat ontvangenResultaat ontvangen
arrow
Token op de pagina plaatsenToken op de pagina plaatsen
arrow
Oplossen, token invoegen en formulier verzenden
Node.js-voorbeeld voor de volledige cyclus van captcha-herkenning op je webpagina. Mogelijke aanpakken: gebruik HTTP-verzoeken om HTML en captcha-parameters te verkrijgen, stuur het antwoord en verwerk het resultaat; of gebruik automatiseringstools (bijv. Playwright) — open de pagina, wacht op de captcha, stuur parameters (voor testen kun je correcte of incorrecte gegevens sturen), verkrijg het resultaat via de CapMonster Cloud-client, voeg de token in het formulier in en bekijk het resultaat.
// npm install playwright
// npx playwright install chromium

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

const API_KEY = "YOUR_API_KEY";
const ALTCHA_PAGE = "https://example.com"; // Jouw site met ALTCHA

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

  // Alle antwoorden van het Altcha-endpoint opvangen
  let challengeResp = null;
  page.on("response", async (response) => {
    try {
      const url = response.url();
      if (url.startsWith("https://captcha.example.com/altcha")) { // Altcha-endpoint
        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" });

  // Klik op het widget, indien aanwezig
  const widgetHandle = await page.$("altcha-widget");
  if (widgetHandle) {
    try {
      await widgetHandle.click();
    } catch {}
  }

  // Wacht op het verschijnen van de challenge
  const start = Date.now();
  while (!challengeResp && Date.now() - start < 60000) { // Timeout verhoogd
    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;

  // Taak aanmaken op 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;

  // Oplossing ophalen
  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;
  }

  //Token invoegen
  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);
})();
Hoe ALTCHA aan je website te koppelen
Om volledig te begrijpen hoe de captcha op je site werkt, de verificatielogica te begrijpen, opnieuw te koppelen of te herconfigureren, raden we je aan deze sectie te lezen. Hier wordt het proces van beveiligingsintegratie beschreven, wat helpt om alle details snel te begrijpen.

1. Widget installeren

Optie 1 — via CDN (het eenvoudigst). Voeg toe aan de <head> van je HTML:

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

Optie 2 — via npm:

npm install altcha

Importeer het widget in je JS-bestand:

import "altcha";

2. Widget toevoegen aan formulier.

Plaats de <altcha-widget> component in het formulier waar bescherming nodig is:


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

challengeurl — jouw serverendpoint om challenge uit te geven.

Als je ALTCHA Sentinel gebruikt (kant-en-klare serverbescherming tegen bots en spam met machine learning en verkeeranalyse), gebruik dan de URL hiervan in plaats van je eigen server:


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

3. Server-side verificatie.

Hoe verificatie verloopt:

  • 1) Widget genereert een payload — Base64-gecodeerde JSON, meestal verzonden als formulierveld altcha.
  • 2) Op de server verifieer je de payload cryptografisch (zonder extra API-verzoeken).
  • 3) Na succesvolle verificatie kan het formulier worden verwerkt.

Verificatie via ALTCHA Sentinel:

Gebruik van de bibliotheekGebruik van de bibliotheek
arrow

Via HTTP API van Sentinel (als bibliotheek niet beschikbaar):Via HTTP API van Sentinel (als bibliotheek niet beschikbaar):
arrow

4. Verificatie zonder Sentinel (eigen server)

Genereren van challenge:


import { createChallenge } from 'altcha-lib';

const hmacKey = '$ecret.key'; // Jouw HMAC geheime sleutel

const challenge = await createChallenge({ hmacKey });

// Challenge in JSON teruggeven voor widget

Payload-verificatie bij formulierverzending:


import { verifySolution } from 'altcha-lib';

const hmacKey = '$ecret.key'; // Jouw HMAC geheime sleutel

const verified = await verifySolution(payload, hmacKey);

if (verified) {
  // Verificatie geslaagd — formuliergegevens verwerken
}

In dit geval maak je zelf de /altcha/challenge endpoint om challenges uit te geven en deze op de server te verifiëren.

Background
Mogelijke fouten en debugging
Bug Icon
Ongeldige challengeurl of API Key
Het widget laadt niet of geeft een fout bij verificatie.
Bug Icon
Oplossingstimeout
De server heeft de payload niet op tijd kunnen verifiëren. Verhoog de wachttijd of zorg dat de serververificatie correct werkt.
Bug Icon
Lege payload
Fout bij het verzenden van het resultaat van het widget naar de server.
Bug Icon
Verification failed
De payload is verlopen, hergebruikt of gemanipuleerd. Voor diagnose, zet logging aan en controleer de velden verified en verificationData in het antwoord van de server of Sentinel.
Controle van de robuustheid
Controleer na de integratie of het systeem de site echt beschermt tegen geautomatiseerde acties.
Aanbevelingen voor veiligheid en optimalisatie
<b>Bewaar geheime sleutels</b> (HMAC of API Key voor Sentinel) alleen op de server — stuur ze niet naar de frontend.
<b>Log fouten</b> en verificatiegebeurtenissen (<b>verified: false</b> en <b>verificationData</b>) om de redenen voor mislukte controles te begrijpen.
Voor transparantie en gebruikersvertrouwen, <b>voeg links naar het privacybeleid</b> en de <b>ALTCHA gebruiksvoorwaarden</b> toe indien nodig.
Conclusie

Als je een website in beheer krijgt waarop al een captcha of een ander beveiligingssysteem is geïnstalleerd en je geen toegang hebt tot de code, is dat geen probleem! Het is vrij eenvoudig te bepalen welke technologie precies wordt gebruikt. Voor het controleren of alles correct werkt, kun je de herkenningsservice CapMonster Cloud in een geïsoleerde testomgeving gebruiken, zodat je zeker weet dat het tokenverwerkingsmechanisme en de validatielogica correct functioneren.

In het geval van ALTCHA is het voldoende om het systeem te herkennen, het gedrag te analyseren en te bevestigen dat de beveiliging correct werkt. In het artikel hebben we laten zien hoe je ALTCHA kunt herkennen en waar je instructies vindt om het te koppelen of opnieuw te configureren, zodat je de bescherming met vertrouwen kunt onderhouden en de werking onder controle kunt houden.

Conclusion
Handige links
DocIconALTCHA-documentatieDocIconALTCHA-broncodeDocIconCapMonster Cloud-documentatie (werken met ALTCHA)