Cloudflare ofrece dos defensas distintas que los desarrolladores frecuentemente confunden: Browser Integrity Check (BIC) y los Challenge CAPTCHA. BIC es una verificación pasiva a nivel de cabecera que bloquea el tráfico que claramente no proviene de un navegador sin ningún challenge; simplemente devuelve un 403. Los Challenge CAPTCHA (Turnstile, JavaScript challenges, managed challenges) presentan una tarea resoluble que los navegadores legítimos pueden superar. La distinción importa porque cada uno requiere una estrategia de manejo diferente.
Cómo se comparan
| Característica | Browser Integrity Check | Challenge CAPTCHA |
|---|---|---|
| Qué comprueba | Solo cabeceras HTTP | Comportamiento del navegador + entorno |
| ¿Se requiere JavaScript? | No (nivel de cabecera) | Sí |
| El usuario ve | Nada (pasa) o 403 (falla) | Widget de challenge o página JS |
| Estado HTTP en error | 403 | 503 |
| ¿Tiene solución? | No: corrige las cabeceras o se bloquea | Sí, resuelve CAPTCHA |
| Cookie emitida | No | qa_validation_cookie |
| ¿Se necesita CaptchaAI? | No: corregir cabeceras de solicitud | Sí |
| Habilitado por defecto | Sí (todos los planes de Cloudflare) | No (configurado por regla) |
| Aplica a | Cada solicitud | Solo reglas WAF coincidentes |
Verificación de integridad del navegador (BIC)
BIC evalúa los encabezados de las solicitudes HTTP para detectar tráfico que obviamente no proviene del navegador. Se ejecuta antes de cualquier desafío de JavaScript o CAPTCHA.
Qué comprueba BIC
| comprobar | lo que busca | Fallos comunes |
|---|---|---|
| Validación de agente de usuario | UA faltante, vacía o defectuosa | python-requests/2.31, rizo, wget |
| Orden de encabezado | Encabezados en orden inusual | Bibliotecas HTTP sin navegador |
| Faltan encabezados del navegador | Faltan Accept, Accept-Language, Accept-Encoding |
Clientes HTTP mínimos |
| Firmas de bots conocidos | UA de spammers, UA de escáner | Googlebot de IP que no son de Google |
| Abuso de listas negras de IP | IP maliciosas conocidas | IP de centros de datos en listas de bloqueo |
flujo BIC
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)
Pasando BIC
BIC se resuelve enviando encabezados adecuados similares a los de un navegador. No se necesita ninguna solución CAPTCHA:
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)
Nodo.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;
}
Desafíos CAPTCHA
Los desafíos CAPTCHA se ejecutan después de que se aprueba BIC. Requieren ejecución de JavaScript y presentan un desafío solucionable:
Tipos de desafíos CAPTCHA de Cloudflare
| Tipo de desafío | gatillo | ¿Visible para el usuario? | Método CaptchaAI |
|---|---|---|---|
| Widget de torniquete | Incrustado en la página por el desarrollador | Widget en el formulario | turnstile |
| Desafío gestionado | Coincidencia de reglas WAF | Adaptativo (invisible/checkbox) | turnstile |
| Desafío de JavaScript | Regla IUAM o WAF | Página "Comprobando tu navegador" | cloudflare_challenge |
| Desafío interactivo | Alta sospecha | Desafío de página completa | cloudflare_challenge |
Flujo de desafío (difiere del BIC)
Request passes BIC check
↓
WAF rules evaluate bot score, IP, path
↓
Rule triggers CAPTCHA challenge (HTTP 503)
↓
Browser executes JavaScript challenge
↓
Challenge solved → qa_validation_cookie cookie issued
↓
Subsequent requests pass with cookie
Distinguir los bloques BIC de los desafíos CAPTCHA
Cuando su solicitud está bloqueada, identificar el tipo determina la solución:
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-like headers to satisfy BIC checks
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']}")
Escenarios comunes
Escenario 1: solo bloque BIC
Request with python-requests UA → 403
Request with Chrome UA → 200 ✓
Fix: Add proper browser headers. No CaptchaAI needed.
Escenario 2: pase BIC, luego CAPTCHA
Request with Chrome UA → 503 (challenge page)
Fix: Headers are fine. Usa CaptchaAI para solve the challenge.
Escenario 3: BIC + CAPTCHA juntos
Request with python-requests UA → 403 (BIC block)
Request with Chrome UA → 503 (CAPTCHA challenge)
Fix: First fix headers, then solve CAPTCHA con CaptchaAI.
Escenario 4: Ninguno: bloqueo de IP
Request with python-requests UA → 403
Request with Chrome UA → 403
Fix: Neither BIC nor solvable challenge. IP is blocked.
Try different IP/proxy.
Mejores prácticas de encabezado
Cabeceras imprescindibles para pasar BIC
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"',
}
Encabezados que activan el bloqueo BIC
| encabezado | Por qué falla |
|---|---|
User-Agent: python-requests/2.31.0 |
Identificador de biblioteca HTTP conocido |
User-Agent: curl/7.81.0 |
Identificador de herramienta CLI |
Falta el encabezado Accept |
Ningún navegador omite Aceptar |
Falta Accept-Language |
Todos los navegadores envían esto |
User-Agent: "" (vacío) |
No válido: automatización obvia |
User-Agent: Googlebot/2.1 de una IP que no es de Google |
Identidad de bot falsa |
Solución de problemas
| Síntoma | causa | Solución |
|---|---|---|
| 403 con encabezados mínimos, 200 con encabezados de navegador | solo BIC | Utilice encabezados similares a los de un navegador |
| 403 con todas las combinaciones de encabezados | IP bloqueada o regla WAF | Pruebe con otra IP o proxy |
| 503 con página de desafío | Desafío CAPTCHA (no BIC) | Utilice CaptchaAI |
| 403 intermitentemente | Limitación de velocidad o basada en sesión | Menor tasa de solicitudes, mantener la sesión |
| Encabezados correctos pero aún 403 | Comprobación de huellas dactilares TLS (JA3) | Utilice curl_cffi o navegador real |
Preguntas frecuentes
¿Puedo desactivar BIC para mi sitio?
Sí. Los operadores del sitio pueden desactivar BIC en el panel de Cloudflare en Seguridad > Configuración. Está habilitado de forma predeterminada en todos los planes.
¿BIC verifica las señales del navegador TLS?
No directamente. BIC se centra en los encabezados HTTP. Sin embargo, la gestión de bots (empresa) más amplia de Cloudflare examina las señales del navegador JA3/JA4 TLS por separado de BIC.
Si paso BIC, ¿seguiré recibiendo CAPTCHA?
Sí. Los desafíos BIC y CAPTCHA son capas independientes. Pasar BIC significa que sus encabezados parecen legítimos. Aún puedes activar un CAPTCHA desde las reglas WAF, la puntuación de bot o el modo IUAM.
¿CaptchaAI ayuda con BIC?
No, BIC no presenta un desafío que tenga solución. Corrija sus encabezados HTTP para pasar BIC. CaptchaAI maneja los desafíos CAPTCHA (Turnstile, desafíos de JavaScript, desafíos administrados) que aparecen después de que pasa BIC.
¿Cómo afectan los encabezados Sec-Fetch a BIC?
Chrome moderno envía encabezados Sec-Fetch-* automáticamente. Su ausencia no siempre activa BIC, pero incluirlos hace que su perfil de solicitud sea más consistente con un navegador real.
Resumen
La verificación de integridad del navegador de Cloudflare bloquea solicitudes con encabezados que obviamente no pertenecen al navegador (403), mientras que los desafíos CAPTCHA presentan tareas solucionables (503). BIC se soluciona mediante el uso de encabezados similares a los de un navegador, noCaptchaAInecesario. Los desafíos CAPTCHA requieren el torniquete de CaptchaAI o el solucionador Cloudflare Challenge. Siempre diagnostique primero el tipo de bloque: corrija los encabezados para BIC, use CaptchaAI para CAPTCHA y cambie las IP para bloques duros.
Artículos relacionados
- Cloudflare Challenge Vs Detección de torniquete
- Comparación de Geetest y Cloudflare Turnstile
- Desafío interactivo versus administrado por Cloudflare