Comparativas

Cloudflare Browser Integrity Check vs Challenge CAPTCHA

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)
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
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

Los comentarios están deshabilitados para este artículo.