Documentation · Audit Dataiads

Autoriser Dataiads à auditer derrière votre WAF.

Si votre origin est protégé par un WAF (Cloudflare, Akamai, Datadome, Imperva), notre IP cloud sortante peut être interceptée par défaut - et le score Reach & read devient non concluant. Plutôt que de nous allowlister par IP, nous signons chaque audit avec un token HMAC court envoyé dans l’en-tête X-Dataiads-Audit.

§ 0 · Comportement par défaut

Cascade automatique anti-WAF

Même sans aucune configuration de votre côté, l’audit Dataiads ne se laisse pas bloquer : si notre fetch direct est intercepté par un WAF, on escalade automatiquement vers Bright Data Web Unlocker (proxy résidentiel + rendu JS). Le score est alors basé sur ce que voit un agent IA réel - proxy résidentiel = environnement réseau le plus proche d’un crawler GPT/Gemini.

Configurer la règle WAF ci-dessous reste recommandé : vous économisez la latence et le coût Bright Data (chaque audit non escaladé est plus rapide et moins cher), et vos audits restent maîtrisés côté origin.

  1. 1 · Direct

    Fetch HTTPS depuis nos serveurs avec header X-Dataiads-Audit . Quand votre règle WAF est en place : 99 % des audits s’arrêtent ici.

  2. 2 · Bright Data

    Si un challenge WAF est détecté → escalade vers Web Unlocker (résidentiel + JS render). Les critères concernés portent un badge via BD dans le rapport.

  3. 3 · Indéterminé

    Si BD échoue aussi (cas rare), les critères Reach & read concernés sortent du calcul - le sous-score reste honnête plutôt qu’injustement zéroté.

§ I · Modèle de confiance

Présence du header vs validation HMAC

Niveau 1 · Présence du header

Configuration la plus simple : votre règle WAF passe en bypass dès que le header est présent et commence par v1.audit. ou v1.domain. Combinez avec un rate limit dédié (ex. 10 req/min) pour limiter le risque qu’un acteur tiers spoofe le header. Suffit pour 95 % des cas.

Niveau 2 · Validation HMAC complète

Pour une garantie cryptographique, déployez un Worker (Cloudflare, Akamai EdgeWorker) qui valide la signature HMAC du token avec une clé partagée. Snippet ci-dessous. Recommandé sur les origins très exposés (services bancaires, retail premium…).

§ II · Cloudflare

Règle Cloudflare Custom WAF

# Cloudflare Dashboard → Security → WAF → Custom rules → Create rule
# Description : Bypass Dataiads audit
# Field : Custom header
# Header name : X-Dataiads-Audit
# Operator : starts with
# Value : v1.audit.   (ou v1.domain. pour les tokens de test)
# Action : Skip → All remaining custom rules → Continue
#
# Optionnel : combiner avec un rate limit dédié pour limiter l'exposition
# (X req/min par IP source quand le header est présent).

Validation HMAC - Cloudflare Worker

Demandez la clé HMAC à Dataiads ( hello@dataiads.io ). À déployer sur la route auditée.

// Cloudflare Worker (validation HMAC complète, optionnel mais robuste)
// Déployez ce Worker sur la route protégée puis configurez la règle WAF
// "Skip remaining" sur le header X-Dataiads-Audit-Verified=1.

const SECRET = "<même valeur que DATAIADS_AUDIT_SECRET côté Dataiads>"

async function hmacBase64Url(secret, body) {
  const key = await crypto.subtle.importKey(
    "raw",
    new TextEncoder().encode(secret),
    { name: "HMAC", hash: "SHA-256" },
    false,
    ["sign"]
  )
  const sig = await crypto.subtle.sign("HMAC", key, new TextEncoder().encode(body))
  return btoa(String.fromCharCode(...new Uint8Array(sig)))
    .replace(/=+$/, "").replace(/\+/g, "-").replace(/\//g, "_")
}

export default {
  async fetch(request) {
    const token = request.headers.get("X-Dataiads-Audit")
    if (!token) return fetch(request)

    const parts = token.split(".")
    if (parts.length !== 5) return fetch(request)

    const [version, scope, ref, expiresAt, hmac] = parts
    if (Date.now() > Number(expiresAt)) return fetch(request)

    const expected = await hmacBase64Url(SECRET, `${version}.${scope}.${ref}.${expiresAt}`)
    if (expected !== hmac) return fetch(request)

    const url = new URL(request.url)
    const headers = new Headers(request.headers)
    headers.set("X-Dataiads-Audit-Verified", "1")
    return fetch(new Request(url, { method: request.method, headers, body: request.body }))
  }
}

§ III · Akamai

Match Request Header → bypass Bot Manager

// Akamai Property Manager → Match : Request Header
//   Header name : X-Dataiads-Audit
//   Match value : starts with "v1.audit."
// Then → Bot Manager Bypass (ou allowlist Kona Site Defender).
//
// Ou via EdgeWorker (équivalent Cloudflare Worker) pour valider la
// signature HMAC : voir les snippets Akamai EdgeKV / SubtleCrypto.

§ IV · Datadome

Custom integration rule

// Datadome ne supporte pas les règles header en self-service standard.
// Demande une "custom integration rule" à Datadome :
//   "Bypass Datadome challenge when header X-Dataiads-Audit starts with v1.audit."
// Datadome support : custom-rules@datadome.co
//
// Workaround : whitelist par IP côté Datadome reste possible mais discouraged
// (cf. doc principale Dataiads sur les risques de l'allowlist IP cloud).

§ V · Tester votre configuration

Vérifier que le header arrive jusqu’à nous

Une fois votre règle WAF déployée, demandez à Dataiads un token long-lived (24h) pour votre domaine, puis appelez l’endpoint de diagnostic. Pas de header reçu = la règle n’est pas active comme attendu.

curl -s "https://app.dataiads.io/api/audit-bypass/verify" \
  -H "X-Dataiads-Audit: <token reçu de Dataiads>"

# Réponse attendue si la règle WAF marche bien :
# { "valid": true, "scope": "domain", "expiresAt": "...", "expiresInSeconds": ... }

# Si "valid": false avec reason="missing_token" → le header n'arrive pas
# jusqu'à nous (votre WAF l'a probablement supprimé en route).
# Si reason="bad_signature" → vous testez avec un token périmé ou contrefait.
# Si reason="expired" → demandez à Dataiads un nouveau token.

Besoin d’un token de test ?

Écrivez à hello@dataiads.io avec votre domaine, on revient sous quelques heures avec un token signé valable 24h.