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 Cloudflare Turnstile 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 Cloudflare Turnstile, 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.
Bij het testen van formulieren met Cloudflare Turnstile moet je vaak bevestigen dat de captcha goed is ingebouwd en werkt.
Je kunt de captcha op je site handmatig testen.
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:
In het verzoek om Cloudflare Turnstile op te lossen, moeten de volgende parameters worden opgegeven:
type - TurnstileTask;
websiteURL - adres van de pagina waar de CAPTCHA wordt opgelost;
websiteKey - Turnstile-sleutel.
https://api.capmonster.cloud/createTask{
"clientKey": "API_KEY",
"task": {
"type": "TurnstileTask",
"websiteURL": "http://tsmanaged.zlsupport.com",
"websiteKey": "0x4AAAAAAABUYP0XeMJF0xoy"
}
}{
"errorId":0,
"taskId":407533072
}https://api.capmonster.cloud/getTaskResult{
"clientKey":"API_KEY",
"taskId": 407533072
}{
"errorId": 0,
"status": "ready",
"solution": {
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36",
"token": "0.iGX3xsyFCkbGePM3jP4P4khLo6TrLukt8ZzBvwuQOvbC...f61f3082"
}
}// npm install playwright @zennolab_com/capmonstercloud-client
import { chromium } from "playwright";
import { CapMonsterCloudClientFactory, ClientOptions, TurnstileRequest } from "@zennolab_com/capmonstercloud-client";
async function main() {
// 1. Turnstile oplossen 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('Turnstile-token ontvangen:', token);
// 2. Playwright starten
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. Login en wachtwoord invullen
await page.fill('#username', 'your_username');
await page.fill('#password', 'your_password');
// 4. Wachten op het verschijnen van het verborgen tokenveld
await page.waitForSelector('#token', { state: 'attached', timeout: 60000 });
// 5. Token invoegen en veld zichtbaar maken
await page.evaluate((t) => {
const tokenInput = document.querySelector('#token');
if (tokenInput) {
tokenInput.type = 'text'; // veld zichtbaar maken
tokenInput.value = t; // token invoegen
console.log('Token ingevoegd in tokenveld');
} else {
console.error('Veld #token niet gevonden');
}
}, token);
// 6. Verifiëren dat het token daadwerkelijk is ingevoegd
const checkValue = await page.$eval('#token', el => el.value);
console.log('Tokenwaarde controleren:', checkValue);
// 7. Formulier verzenden
await page.click('button[type="submit"]');
console.log('Formulier verzonden met Turnstile-token');
// await browser.close();
}
main().catch(err => console.error(err));1. Ga naar de pagina Cloudflare Turnstile, klik op Nu beginnen.
2. Registreer bij de service.
3. Klik in Turnstile Widgets op de blauwe knop Add Widget.

4. Configureer Cloudflare Turnstile, specificeer:
5. Na het maken van de widget ontvangt u twee sleutels—Site Key en Secret Key.

6. Koppel het client-side deel
1) Koppel het Turnstile-script
Automatische rendering (widget wordt automatisch gemaakt bij het laden van de pagina):
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>Programmatische controle (u maakt zelf de widget via JavaScript):
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit" defer></script>Belangrijk: het script moet worden geladen vanaf de exacte URL. Proxy of cache kunnen storingen veroorzaken.
2) Maak een container voor de widget
Automatisch:
<div class="cf-turnstile" data-sitekey="<YOUR_SITEKEY>"></div>Programmatisch:
<div id="turnstile-container"></div>3) Widget-configuratie
Via data-attributen:
<div class="cf-turnstile"
data-sitekey="<YOUR_SITEKEY>"
data-theme="light"
data-size="normal"
data-callback="onSuccess">
</div>Via JavaScript:
const widgetId = turnstile.render("#turnstile-container", {
sitekey: "<YOUR_SITEKEY>",
theme: "light",
size: "normal",
callback: token => console.log("Token:", token)
});4) Werken met tokens
const token = turnstile.getResponse(widgetId); // token ophalen
const isExpired = turnstile.isExpired(widgetId); // verloop controleren
turnstile.reset(widgetId); // resetten
turnstile.remove(widgetId); // verwijderen
turnstile.execute("#turnstile-container"); // handmatige uitvoering
5) Integratie met formulier
<form id="my-form" method="POST">
<input type="hidden" name="cf-turnstile-response" id="cf-turnstile-response">
<button type="submit">Verzenden</button>
</form>
<script>
function onSuccess(token) {
document.getElementById("cf-turnstile-response").value = token;
}
</script>
<title>Turnstile Example</title>
<!-- Turnstile-script koppelen -->
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
</head>
<body>
<h1>Formuliervoorbeeld met Turnstile</h1>
<form id="my-form">
<label for="username">Naam:</label>
<input type="text" name="username" id="username" required>
<!-- Container voor Turnstile -->
<div class="cf-turnstile" data-sitekey="<YOUR_SITEKEY>" data-callback="onTurnstileSuccess"></div>
<button type="submit">Verzenden</button>
</form>
<script>
// Callback die wordt aangeroepen na het voltooien van de CAPTCHA
function onTurnstileSuccess(token) {
console.log("Turnstile-token ontvangen:", token);
// Token opslaan in verborgen formulierveld (optioneel)
document.getElementById("cf-turnstile-token")?.remove();
const input = document.createElement("input");
input.type = "hidden";
input.name = "cf-turnstile-response";
input.id = "cf-turnstile-token";
input.value = token;
document.getElementById("my-form").appendChild(input);
}
// Formulierverzending
document.getElementById("my-form").addEventListener("submit", async (e) => {
e.preventDefault();
const formData = new FormData(e.target);
const response = await fetch("/submit-form", {
method: "POST",
body: formData
});
const result = await response.json();
if(result.success){
alert("Formulier succesvol verzonden en token geverifieerd!");
} else {
alert("Fout bij Turnstile-tokenverificatie. Probeer het opnieuw.");
// Widget resetten zodat de gebruiker de CAPTCHA opnieuw kan voltooien
turnstile.reset();
}
});
</script>
</body>
</html>
6) Configureer het server-side deel
Server-side verificatieproces:
Siteverify API:
https://challenges.cloudflare.com/turnstile/v0/siteverifyVerzoekparameters:
Token-eigenschappen:
<?php
function validateTurnstile($token, $secret, $remoteip = null) {
$url = 'https://challenges.cloudflare.com/turnstile/v0/siteverify';
$data = ['secret' => $secret, 'response' => $token];
if ($remoteip) $data['remoteip'] = $remoteip;
$options = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded
",
'method' => 'POST',
'content' => http_build_query($data)
]
];
$response = file_get_contents($url, false, stream_context_create($options));
if ($response === FALSE) {
return ['success' => false, 'error-codes' => ['internal-error']];
}
return json_decode($response, true);
}
// Gebruik
$secret_key = 'YOUR_SECRET_KEY';
$token = $_POST['cf-turnstile-response'] ?? '';
$remoteip = $_SERVER['REMOTE_ADDR'];
$result = validateTurnstile($token, $secret_key, $remoteip);
if($result['success']){
echo "Formulier succesvol verzonden!";
} else {
echo "Verificatiefout: " . implode(', ', $result['error-codes']);
}
?>
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 Cloudflare Turnstile 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 Cloudflare Turnstile 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.