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:
- Dieselbe URL zweimal abrufen – mit minimalen Headern und mit vollem Browser-Profil.
- Die Statuscodes vergleichen (
403gegen200/503). - Bei
503den HTML-Body aufjschlodercf-turnstileprü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.