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 DataDome CAPTCHA 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 DataDome CAPTCHA, 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.
Werken met CapMonster Cloud via de API bestaat doorgaans uit de volgende stappen:
type - CustomTask
class - DataDome
websiteURL - Het adres van de hoofdpagina waarop de CAPTCHA wordt opgelost.
captchaUrl (binnen metadata) - "captchaUrl" — de link naar de CAPTCHA. Meestal in het formaat: "https://geo.captcha-delivery.com/captcha/?initialCid=..."
datadomeCookie (binnen metadata) - Je DataDome-cookies. Verkrijgbaar op de pagina via document.cookie (als cookies geen HttpOnly-vlag hebben), in de Set-Cookie-header van het verzoek: "datadome=..." of direct uit de HTML-code van de pagina initialCid.
userAgent - Browser User-Agent. Gebruik alleen de actuele UA van Windows.
Voor deze taak is het ook nodig om je eigen proxies te gebruiken:
proxyType :
proxyAddress - IPv4/IPv6-adres van de proxy.
proxyPort - Poort van de proxy.
proxyLogin - Proxy-login.
proxyPassword - Proxy-wachtwoord.
https://api.capmonster.cloud/createTask
{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "DataDome",
"websiteURL": "https://example.com",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36",
"metadata": {
"captchaUrl": "https://geo.captcha-delivery.com/interstitial/?initialCid=AHrlqAAAAAMA9UvsL58YLqIAXNLFPg%3D%3D&hash=C0705ACD75EBF650A07FF8291D3528&cid=7sfa5xUfDrR4bQTp1c2mhtiD7jj9TXExcQypjdNAxKVFyIi1S9tE0~_mqLa2EFpOuzxKcZloPllsNHjNnqzD9HmBA4hEv7SsEyPYEidCBvjZEaDyfRyzefFfolv0lAHM&referer=https%3A%2F%2Fwww.example.com.au%2F&s=6522&b=978936&dm=cm",
"datadomeCookie": "datadome=VYUWrgJ9ap4zmXq8Mgbp...64emvUPeON45z"
},
"proxyType": "http",
"proxyAddress": "123.45.67.89",
"proxyPort": 8080,
"proxyLogin": "proxyUsername",
"proxyPassword": "proxyPassword"
}
}
{
"errorId":0,
"taskId":407533072
}https://api.capmonster.cloud/getTaskResult{
"clientKey":"API_KEY",
"taskId": 407533072
}
{
"errorId": 0,
"status": "ready",
"solution": {
"domains": {
"www.example.com": {
"cookies": {
"datadome": "P1w0VnjFcTFslfps0J4FaPpY_QPbPBW4MeYxj4LW~pztIfJiSSuBPr8oQTUHzdrfgv137FbOBd3kCUOOgny7LhIkhm5e1qdtzYM4s2e46U_qfERK4KiCy22MOSIDsDyh"
},
"localStorage": null
}
},
"url": null,
"fingerprint": null,
"headers": null,
"data": null
}
}
// npx playwright install chromium
import { chromium } from 'playwright';
import { CapMonsterCloudClientFactory, ClientOptions, DataDomeRequest } from '@zennolab_com/capmonstercloud-client';
// Voer je CapMonster Cloud API-sleutel in
const API_KEY = 'YOUR_API_KEY';
// Je website is beschermd door DataDome
const TARGET_URL = 'https://example.com/';
const USER_AGENT = Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
// Proxy-instellingen
const proxy = {
proxyType: "http",
proxyAddress: '8.8.8.8',
proxyPort: 8080,
proxyLogin: 'proxyLogin',
proxyPassword: 'proxyPassword'
};
async function main() {
// Browser starten
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({ userAgent: USER_AGENT });
const page = await context.newPage();
// Ga naar de website
await page.goto(TARGET_URL, { waitUntil: 'networkidle' });
// Zoek naar bestaande datadome-cookie (indien aanwezig)
const existingDd = (await context.cookies()).find(c => /datadome|dd_/i.test(c.name));
// Zoek DataDome iframe -> CAPTCHA URL
const captchaUrl = await page.evaluate(() =>
Array.from(document.querySelectorAll('iframe[src]'))
.find(i => /captcha-delivery\.com\/captcha/i.test(i.src))
?.src || null
);
console.log(`=== Uitgehaalde DataDome-parameters ===`);
console.log(`captchaUrl:`, captchaUrl || 'niet gevonden');
console.log(`huidige datadome-cookie::`, existingDd ? ${existingDd.name}=${existingDd.value}` : 'geen');
const cm = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);
// Verstuur taak naar CapMonster
console.log(`Verstuur DataDome-taak naar CapMonster......`);
// Verstuur taak voor DataDome-oplossing
const solve = await cm.Solve(new DataDomeRequest({
_class: "DataDome",
websiteURL: TARGET_URL,
userAgent: USER_AGENT,
proxy,
metadata: {
captchaUrl: captchaUrl || undefined,
datadomeCookie: existingDd
? `${existingDd.name}=${existingDd.value}`
: undefined
}
}));
const sol = solve?.solution;
// Ontvang domein en benodigde cookies uit de oplossing
const host = new URL(TARGET_URL).hostname;
const domainKey =
Object.keys(sol.domains).find(d => d.includes(host))
|| Object.keys(sol.domains)[0];
const cookiesArr = sol.domains[domainKey]?.cookies || [];
console.log(`\n=== Cookies van CapMonster ===`);
cookiesArr.forEach(c => console.log(`${c.name}=${c.value}`));
const ddSolved =
cookiesArr.find(c => c.name?.toLowerCase() === 'datadome')
|| cookiesArr.find(c => /datadome/i.test(c.name));
// Stel datadome-cookie in browser in
await context.addCookies([{
name: 'datadome',
value: ddSolved.value,
domain: '.' + host,
path: '/',
httpOnly: ddSolved.httpOnly ?? true,
secure: ddSolved.secure ?? true,
sameSite: ddSolved.sameSite ?? 'Lax'
}]);
console.log(`datadome-cookie ingesteld:`, ddSolved.value);
// Open de site opnieuw na het invoegen van de cookie
const page2 = await context.newPage();
const resp2 = await page2.goto(TARGET_URL, { waitUntil: 'domcontentloaded', timeout: 60000 });
console.log(`Status na cookie-instelling:: ${resp2?.status()}`);
await browser.close();
}
main();
1. Log in op je account of registreer bij DataDome en verkrijg de client-side en server-side sleutels.
Belangrijk: gebruik een bedrijfs-e-mail voor registratie.
Na registratie krijg je toegang tot het admin-paneel.
2. Voeg je website (domein) toe in het DataDome-paneel.
Voeg je domein toe aan het systeem en kies de beschermingsinstellingen:
3. Installeer server-side integratie.
Gebruik Protection API of kies een module voor je stack (Node.js / Express, Nginx, Cloudflare, Java (Tomcat/Jetty/Vert.x), Go, enz.).
Installeer de officiële DataDome SDK/middleware en configureer de server-side key.
Voorbeeld DataDome-integratie in Node.js:
DataDome beschermt de server tegen bots en verdachte verzoeken en toont automatisch challenge indien nodig. Module kan met Express of ingebouwde HTTP-server Node.js worden gebruikt.
Installatie
Voor Express:
npm install @datadome/module-expressVoor Node.js HTTP-module:
npm install @datadome/module-httpNode.js 18+ ondersteund. Server-side key vereist vanuit DataDome-paneel.
const { DatadomeExpress } = require('@datadome/module-express');
const express = require('express');
const app = express();
// Initialiseer DataDome-client
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY');
// Koppel middleware
app.use(datadomeClient.middleware());
// Jouw routes
app.get('/', (req, res) => {
res.send('Hello World');
});
// Start server
app.listen(3000, () => {
console.log('Server running on port 3000');
})
const { DatadomeHttp } = require('@datadome/module-http');
const http = require('http');
const datadomeClient = new DatadomeHttp('YOUR_SERVER_KEY');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer(async (req, res) => {
const { result, error } = await datadomeClient.handleRequest(req, res);
if (result === 'ALLOW') {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
} else {
console.log('Request challenged');
if (error) console.error(error);
}
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});Module-instellingen
Je kunt configuratie doorgeven bij het maken van de client:
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY', {
timeout: 150, // timeout in ms waarna het verzoek wordt toegestaan
urlPatternInclusion: null, // welke URL's te controleren
urlPatternExclusion: /\.(avi|flv|mka|mkv|mov|mp4|mpeg|mpg|mp3|flac|ogg|ogm|opus|wav|webm|webp|bmp|gif|ico|jpeg|jpg|png|svg|svgz|swf|eot|otf|ttf|woff|woff2|css|less|js|map|json|avif|xml|gz|zip)$/i,
endpointHost: 'api.datadome.co',
});Geavanceerde opties:
Meer details over server-side integratie in officiële documentatie.
4. Integreer client-side.
Plaats de JS-tag in het <head> van je website:
<head>
<script>
window.ddjskey = 'YOUR_DATADOME_JS_KEY';
window.ddoptions = {
// Voeg hier je instellingen toe (optioneel)
};
</script>
<script src="https://js.datadome.co/tags.js" async></script>
<!-- Andere head-elementen -->
</head>
YOUR_DATADOME_JS_KEY → Vervang door je Client-Side key.
Het script moet aan het begin van <head> worden geladen zodat DataDome verzoeken kan onderscheppen en gebruikersgedrag correct volgen.
Gebruik CSP? Voeg de volgende richtlijnen toe:
<script nonce="DYNAMIC_NONCE">
window.ddjskey = 'YOUR_DATADOME_JS_KEY';
window.ddoptions = {};
</script>
script-src js.datadome.co ct.captcha-delivery.com 'nonce-DYNAMIC_NONCE';
connect-src api-js.datadome.co; /* voor het verzenden van JS Tag-gegevens */
frame-src *.captcha-delivery.com; /* voor challenge-pagina's */
worker-src blob:; /* voor web workers */
Meer details over client-side integratie in DataDome CAPTCHA officiële documentatie.
Resultaatcontrole
DataDome maakt de cookie datadome= aan na een succesvolle verificatie. Deze cookie wordt automatisch door de gebruiker verzonden, en de server laat het verzoek door. Als de cookie ontbreekt of ongeldig is, toont DataDome opnieuw een challenge.
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 DataDome CAPTCHA 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 DataDome CAPTCHA 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.