Vergleiche

Cloudflare Browser Integrity Check vs. CAPTCHA-Challenge

Ein 403 und ein 503 von Cloudflare sind zwei völlig verschiedene Probleme – und nur eines davon lösen Sie mit einem CAPTCHA-Solver. Der Browser Integrity Check (BIC) ist eine passive Prüfung auf Header-Ebene: Sieht Ihre Anfrage nicht nach echtem Browser aus, kommt ein 403 Forbidden ganz ohne Abfrage zurück. Eine CAPTCHA-Challenge (Turnstile, JavaScript-Challenge, Managed Challenge) ist dagegen eine lösbare Aufgabe und quittiert einen 503. Wer beides verwechselt, repariert stundenlang Header, obwohl längst ein cf_clearance-Cookie fällig wäre. Dieser Artikel zeigt, wie Sie den Block-Typ erkennen.

BIC und CAPTCHA-Challenge im direkten Vergleich

Merkmal Browser Integrity Check CAPTCHA-Challenge
Was geprüft wird Nur HTTP-Header Browser-Verhalten + Umgebung
JavaScript nötig? Nein (Header-Ebene) Ja
Nutzer sieht Nichts (bestanden) oder 403 (Fehler) Challenge-Widget oder JS-Seite
HTTP-Status bei Fehler 403 503
Lösbar? Nein – Header korrigieren, sonst blockiert Ja – CAPTCHA lösen
Cookie ausgestellt Nein cf_clearance
CaptchaAI nötig? Nein – Anfrage-Header korrigieren Ja
Standardmäßig aktiv Ja (alle Cloudflare-Pläne) Nein (pro Regel konfiguriert)
Gilt für Jede Anfrage Nur passende WAF-Regeln

Merksatz: BIC ist der Türsteher, die Challenge steht dahinter – und greift nur bei passender WAF-Regel.

Was der Browser Integrity Check prüft

BIC wertet die HTTP-Header aus, um offensichtlichen Nicht-Browser-Verkehr auszusortieren – vor jeder JavaScript- oder CAPTCHA-Challenge, allein anhand des Anfrage-Kopfs.

Prüfung Worauf geachtet wird Typische Auslöser
User-Agent-Validierung Fehlender, leerer oder bekannt schlechter UA python-requests/2.31, curl, wget
Header-Reihenfolge Header in ungewöhnlicher Reihenfolge Nicht-Browser-HTTP-Bibliotheken
Fehlende Browser-Header Accept, Accept-Language, Accept-Encoding fehlen Minimale HTTP-Clients
Bekannte Bot-Signaturen Spam- und Scanner-UAs Googlebot von Nicht-Google-IPs
Missbrauchs-IP-Listen Bekannt schädliche IPs Rechenzentrums-IPs auf Sperrlisten

Der letzte Punkt trifft DACH-Teams oft: Wer aus einem Hetzner-, netcup- oder IONOS-Rechenzentrum scrapt, landet leicht auf einer geteilten Datacenter-IP, die schon gesperrt ist. Dann hilft nur ein Residential-Proxy oder eine andere IP.

Hinweis: IP-Adressen gelten nach DSGVO als personenbezogene Daten. Prüfen Sie beim Einsatz von Proxys Ihre Datenflüsse und die Rechtsgrundlage, bevor Sie in Produktion gehen.

Ablauf der BIC-Prüfung

Request hits Cloudflare edge
    ↓
BIC evaluates HTTP headers:
  ├─ User-Agent present and valid?
  ├─ Required headers (Accept, Accept-Language) present?
  ├─ Header order consistent with browser?
  └─ IP not on abuse list?
    ↓
Pass → Request forwarded to origin
    OR
Fail → 403 Forbidden (no challenge offered)

BIC bestehen

BIC bestehen Sie mit realistischen, browserähnlichen Headern – ganz ohne CAPTCHA-Solver:

import requests

# ❌ FAILS BIC — minimal headers
response = requests.get("https://cloudflare-protected.com")
# User-Agent: python-requests/2.31.0
# Result: 403 Forbidden

# ✅ PASSES BIC — browser-like headers
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/120.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,"
              "image/avif,image/webp,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "Connection": "keep-alive",
    "Upgrade-Insecure-Requests": "1",
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "none",
    "Sec-Fetch-User": "?1",
}

response = requests.get("https://cloudflare-protected.com", headers=headers)
# Result: 200 OK (passed BIC)

Node.js

const axios = require("axios");

// Browser-like headers to pass BIC
const headers = {
  "User-Agent":
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0",
  Accept:
    "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,*/*;q=0.8",
  "Accept-Language": "en-US,en;q=0.9",
  "Accept-Encoding": "gzip, deflate, br",
  Connection: "keep-alive",
  "Upgrade-Insecure-Requests": "1",
  "Sec-Fetch-Dest": "document",
  "Sec-Fetch-Mode": "navigate",
  "Sec-Fetch-Site": "none",
  "Sec-Fetch-User": "?1",
};

async function fetchWithBIC(url) {
  const response = await axios.get(url, { headers });
  console.log(`Status: ${response.status}`);
  return response.data;
}

Wann Cloudflare eine CAPTCHA-Challenge stellt

Eine CAPTCHA-Challenge greift erst, nachdem der BIC bestanden ist. Sie braucht JavaScript und stellt eine tatsächlich lösbare Aufgabe:

Challenge-Typ Auslöser Für Nutzer sichtbar? CaptchaAI-Methode
Turnstile-Widget Vom Entwickler in die Seite eingebettet Widget im Formular turnstile
Managed Challenge Treffer einer WAF-Regel Adaptiv (unsichtbar/Checkbox) turnstile
JavaScript-Challenge IUAM- oder WAF-Regel Seite „Überprüfen Sie Ihren Browser" cloudflare_challenge
Interactive Challenge Hoher Verdacht Ganzseitige Challenge cloudflare_challenge

Ablauf der Challenge (anders als beim BIC)

Request passes BIC check
    ↓
WAF rules evaluate bot score, IP, path
    ↓
Rule triggers CAPTCHA challenge (HTTP 503)
    ↓
Browser executes JavaScript challenge
    ↓
Challenge solved → cf_clearance cookie issued
    ↓
Subsequent requests pass with cookie

Das ausgestellte cf_clearance-Cookie trägt Folge-Anfragen durch, bis es abläuft.

Block-Typ zuverlässig diagnostizieren

Bevor Sie etwas reparieren, klären Sie, welcher Block vorliegt. Der Ansatz ist immer derselbe:

  1. Dieselbe URL zweimal abrufen – mit minimalen Headern und mit vollem Browser-Profil.
  2. Die Statuscodes vergleichen (403 gegen 200/503).
  3. Bei 503 den HTML-Body auf jschl oder cf-turnstile prüfen.

Die Funktion fasst das zusammen:

import requests

def diagnose_cloudflare_block(url):
    """Determine if block is BIC or CAPTCHA."""
    # Intentionally use minimal headers to trigger BIC
    minimal_response = requests.get(url, timeout=15, allow_redirects=False)

    # Use browser headers to bypass BIC
    browser_headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                      "AppleWebKit/537.36 Chrome/120.0.0.0",
        "Accept": "text/html,application/xhtml+xml,*/*;q=0.8",
        "Accept-Language": "en-US,en;q=0.9",
        "Accept-Encoding": "gzip, deflate, br",
    }
    browser_response = requests.get(
        url, headers=browser_headers, timeout=15, allow_redirects=False
    )

    result = {
        "minimal_headers_status": minimal_response.status_code,
        "browser_headers_status": browser_response.status_code,
    }

    if minimal_response.status_code == 403 and browser_response.status_code == 200:
        result["diagnosis"] = "BIC only — fix headers to pass"
        result["fix"] = "Add browser-like headers"

    elif minimal_response.status_code == 403 and browser_response.status_code == 403:
        result["diagnosis"] = "IP or WAF block — not just BIC"
        result["fix"] = "Change IP or check WAF rules"

    elif browser_response.status_code == 503:
        html = browser_response.text
        if "jschl" in html:
            result["diagnosis"] = "IUAM JavaScript challenge"
            result["fix"] = "Use CaptchaAI cloudflare_challenge method"
        elif "cf-turnstile" in html or "challenge-platform" in html:
            result["diagnosis"] = "Managed/Turnstile challenge"
            result["fix"] = "Use CaptchaAI turnstile method"
        else:
            result["diagnosis"] = "Unknown Cloudflare challenge"
            result["fix"] = "Inspect page source for challenge type"

    elif browser_response.status_code == 200:
        html = browser_response.text
        if "cf-turnstile" in html:
            result["diagnosis"] = "Page loads but has Turnstile widget"
            result["fix"] = "Use CaptchaAI turnstile method for form submission"
        else:
            result["diagnosis"] = "No challenge — page accessible"
            result["fix"] = "None needed"

    return result


# Usage
diagnosis = diagnose_cloudflare_block("https://example-cf-site.com")
print(f"Diagnosis: {diagnosis['diagnosis']}")
print(f"Fix: {diagnosis['fix']}")

Die vier häufigsten Fälle in der Praxis

Die Diagnose läuft auf vier Muster hinaus:

Fall 1 – nur BIC. Chrome-Header genügen, kein Solver:

Request with python-requests UA → 403
Request with Chrome UA → 200 ✓

Fix: Add proper browser headers. No CaptchaAI needed.

Fall 2 – BIC bestanden, dann CAPTCHA. Header stimmen, jetzt kommt die Challenge:

Request with Chrome UA → 503 (challenge page)

Korrektur: Die Header sind in Ordnung. Lösen Sie die Herausforderung mit CaptchaAI.

Fall 3 – BIC und CAPTCHA gemeinsam. Erst Header, dann lösen:

Request with python-requests UA → 403 (BIC block)
Request with Chrome UA → 503 (CAPTCHA challenge)

Korrektur: Beheben Sie zuerst die Header und lösen Sie danach das CAPTCHA mit CaptchaAI.

Fall 4 – weder noch, die IP ist gesperrt. Das Datacenter-Szenario; kein Header hilft, weil die IP selbst das Problem ist:

Request with python-requests UA → 403
Request with Chrome UA → 403

Fix: Neither BIC nor solvable challenge. IP is blocked.
Try different IP/proxy.

Header-Best-Practices für den BIC

Diese Vorlage deckt die Signale ab, die aktuelle Chrome-Versionen automatisch senden – vollständig mitgeschickt, wirkt Ihr Request wie ein echter Browser:

CLOUDFLARE_SAFE_HEADERS = {
    # Mandatory
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/120.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",

    # Strongly recommended
    "Connection": "keep-alive",
    "Upgrade-Insecure-Requests": "1",

    # Sec-Fetch headers (modern Chrome)
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "none",
    "Sec-Fetch-User": "?1",

    # Recommended for consistency
    "Sec-Ch-Ua": '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
    "Sec-Ch-Ua-Mobile": "?0",
    "Sec-Ch-Ua-Platform": '"Windows"',
}

Header, die einen BIC-Block auslösen

Header Warum er scheitert
User-Agent: python-requests/2.31.0 Bekannte HTTP-Bibliotheks-Kennung
User-Agent: curl/7.81.0 CLI-Tool-Kennung
Fehlender Accept-Header Kein Browser lässt Accept weg
Fehlender Accept-Language Alle Browser senden ihn
User-Agent: "" (leer) Ungültig – offensichtliche Automatisierung
User-Agent: Googlebot/2.1 von Nicht-Google-IP Gefälschte Bot-Identität

Fehlerbehebung

Symptom Ursache Behebung
403 mit minimalen Headern, 200 mit Browser-Headern Nur BIC Browserähnliche Header verwenden
403 mit jeder Header-Kombination IP gesperrt oder WAF-Regel Andere IP oder Proxy testen
503 mit Challenge-Seite CAPTCHA-Challenge (nicht BIC) CaptchaAI verwenden
403 sporadisch Rate-Limiting oder sitzungsabhängig Anfragerate senken, Sitzung halten
Header korrekt, trotzdem 403 TLS-Fingerprint-Prüfung (JA3) curl_cffi oder echten Browser nutzen

Häufige Fragen

Woran erkenne ich, ob mich BIC oder ein CAPTCHA blockiert?

Am Statuscode: 403 ohne Challenge-Seite deutet auf BIC (oder eine IP-Sperre), 503 mit Challenge-Seite auf eine CAPTCHA-Challenge. Der Doppel-Request aus dem Diagnose-Abschnitt klärt es zuverlässig.

Warum blockiert Cloudflare meine Requests vom Hetzner- oder netcup-Server?

Weil Rechenzentrums-IPs häufig auf Cloudflares Missbrauchslisten stehen – oft wegen früherer Nachbarn auf derselben geteilten IP. Dann bleibt es bei 403, egal wie sauber Ihre Header sind. Der Ausweg ist ein Residential-Proxy oder eine andere IP (Fall 4).

Hilft CaptchaAI, den Browser Integrity Check zu bestehen?

Nein. Der BIC prüft nur HTTP-Header – dafür brauchen Sie korrekte Header, keinen Solver. CaptchaAI übernimmt erst die CAPTCHA-Challenges (Turnstile, JavaScript-Challenge, Managed Challenge), die nach bestandenem BIC erscheinen.

Reicht ein realistischer User-Agent, um den BIC zu bestehen?

Meist nicht allein. Fehlen Accept, Accept-Language oder die Sec-Fetch-*-Header, wirkt das Profil unvollständig. Senden Sie den ganzen CLOUDFLARE_SAFE_HEADERS-Satz. Bleibt der 403, steckt oft eine TLS-Fingerprint-Prüfung (JA3) dahinter – dagegen hilft nur curl_cffi oder ein echter Browser.

Kann ich den BIC als Seitenbetreiber deaktivieren?

Ja. Im Cloudflare-Dashboard lässt sich der BIC unter „Security > Settings" abschalten. Standardmäßig ist er in allen Plänen aktiv.

Fazit

Cloudflare-Blocks fallen in zwei Klassen. Der Browser Integrity Check wehrt nicht-browserartige Header per 403 ab – hier hilft kein Solver, sondern nur ein sauberes Header-Profil (und bei Datacenter-IPs eine andere IP). Eine CAPTCHA-Challenge quittiert einen 503; dafür setzen Sie den Turnstile- oder Cloudflare-Challenge-Solver von CaptchaAI ein. Diagnostizieren Sie immer zuerst den Block-Typ: Header beim BIC, CaptchaAI bei CAPTCHAs, IP-Wechsel bei harten Sperren.

Verwandte Artikel

Kommentare sind für diesen Artikel deaktiviert.