A Cloudflare oferece duas defesas distintas que os desenvolvedores costumam confundir: os desafios Verificação de integridade do navegador (BIC) e CAPTCHA. BIC é uma verificação passiva no nível do cabeçalho que bloqueia obviamente o tráfego que não é do navegador sem qualquer desafio - ele simplesmente retorna um 403. Desafios CAPTCHA (Turnstile, desafios de JavaScript, desafios gerenciados) apresentam uma tarefa solucionável que navegadores legítimos podem passar. A distinção é importante porque cada um requer uma estratégia de manejo diferente.
Como eles se comparam
| Recurso | Verificação de integridade do navegador | Desafio CAPTCHA |
|---|---|---|
| O que verifica | Apenas cabeçalhos HTTP | Comportamento do navegador + ambiente |
| JavaScript necessário? | Não (nível do cabeçalho) | Sim |
| O usuário vê | Nada (aprovado) ou 403 (reprovado) | Widget de desafio ou página JS |
| Status HTTP em caso de falha | 403 | 503 |
| Resolúvel? | Não – corrija cabeçalhos ou bloqueia | Sim - resolva CAPTCHA |
| Cookie emitido | Não | cookie_qa_validacao |
| CaptchaAI necessário? | Não – corrija os cabeçalhos da solicitação | Sim |
| Ativado por padrão | Sim (todos os planos Cloudflare) | Não (configurado por regra) |
| Aplica-se a | Cada solicitação | Apenas regras WAF correspondentes |
Verificação de integridade do navegador (BIC)
O BIC avalia cabeçalhos de solicitação HTTP para detectar tráfego obviamente não relacionado ao navegador. Ele é executado antes de qualquer desafio JavaScript ou CAPTCHA.
O que o BIC verifica
| Verifique | O que procura | Falhas comuns |
|---|---|---|
| Validação User-Agent | UA ausente, vazio ou sabidamente inválido | python-requests/2.31, enrolar, wget |
| Ordem do cabeçalho | Cabeçalhos em ordem incomum | Bibliotecas HTTP sem navegador |
| Cabeçalhos do navegador ausentes | Accept, Accept-Language, Accept-Encoding ausentes |
Clientes HTTP mínimos |
| Assinaturas de bot conhecidas | UAs de spam, UAs de scanner | Googlebot de IPs que não são do Google |
| Abuso de listas negras de IP | IPs maliciosos conhecidos | IPs de datacenter em listas de bloqueio |
Fluxo 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)
Passando no BIC
O BIC é resolvido enviando cabeçalhos adequados, semelhantes aos do navegador. Nenhuma solução CAPTCHA é necessária:
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;
}
Desafios CAPTCHA
Os desafios CAPTCHA são executados após a aprovação do BIC. Eles exigem execução de JavaScript e apresentam um desafio solucionável:
Tipos de desafios CAPTCHA da Cloudflare
| Tipo de desafio | Gatilho | Visível para o usuário? | Método CaptchaAI |
|---|---|---|---|
| Widget de catraca | Incorporado na página pelo desenvolvedor | Widget no formulário | turnstile |
| Desafio Gerenciado | Correspondência de regras WAF | Adaptativo (invisível/checkbox) | turnstile |
| Desafio JavaScript | Regra IUAM ou WAF | Página "Verificando seu navegador" | turnstile_staging |
| Desafio Interativo | Alta suspeita | Desafio de página inteira | turnstile_staging |
Fluxo do desafio (diferente do BIC)
Request passes BIC check
↓
WAF rules evaluate bot score, IP, path
↓
Rule triggers CAPTCHA challenge (HTTP 503)
↓
Browser executes JavaScript challenge
↓
Challenge solved → cookie_qa_validacao cookie issued
↓
Subsequent requests pass with cookie
Distinguindo blocos BIC de desafios CAPTCHA
Quando sua solicitação é bloqueada, a identificação do tipo determina a correção:
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 validação autorizada 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 a CaptchaAI turnstile_staging method"
elif "cf-turnstile" in html or "challenge-platform" in html:
result["diagnosis"] = "Managed/Turnstile challenge"
result["fix"] = "Use a CaptchaAI turnstile method"
else:
result["diagnosis"] = "Unknown Cloudflare Turnstile em staging"
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 a 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']}")
Cenários comuns
Cenário 1: somente bloco BIC
Request with python-requests UA → 403
Request with Chrome UA → 200 ✓
Fix: Add proper browser headers. No CaptchaAI needed.
Cenário 2: passagem BIC, depois CAPTCHA
Request with Chrome UA → 503 (challenge page)
Fix: Headers are fine. Use a CaptchaAI to solve the challenge.
Cenário 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 with CaptchaAI.
Cenário 4: Nenhum dos dois – bloco 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.
Práticas recomendadas de cabeçalho
Cabeçalhos essenciais para passar no 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"',
}
Cabeçalhos que acionam o bloqueio do BIC
| Cabeçalho | Por que falha |
|---|---|
User-Agent: python-requests/2.31.0 |
Identificador de biblioteca HTTP conhecido |
User-Agent: curl/7.81.0 |
Identificador da ferramenta CLI |
Cabeçalho Accept ausente |
Nenhum navegador omite Aceitar |
Faltando Accept-Language |
Todos os navegadores enviam isso |
User-Agent: "" (vazio) |
Inválido – automação óbvia |
User-Agent: Googlebot/2.1 de IP que não é do Google |
Identidade de bot falsa |
Solução de problemas
| Sintoma | Causa | Correção |
|---|---|---|
| 403 com cabeçalhos mínimos, 200 com cabeçalhos de navegador | Somente BIC | Use cabeçalhos semelhantes aos do navegador |
| 403 com todas as combinações de cabeçalho | IP bloqueado ou regra WAF | Experimente um IP ou proxy diferente |
| 503 com página de desafio | Desafio CAPTCHA (não BIC) | Usar CaptchaAI |
| 403 intermitentemente | Limitação de taxa ou baseada em sessão | Taxa de solicitação mais baixa, mantenha a sessão |
| Cabeçalhos corretos, mas ainda 403 | Verificação de sinal de navegador TLS (JA3) | Use curl_cffi ou navegador real |
Perguntas frequentes
Posso desabilitar o BIC para meu site?
Sim. Os operadores do site podem desativar o BIC no painel da Cloudflare em Segurança > Configurações. Está habilitado por padrão em todos os planos.
O BIC verifica as impressões digitais do TLS?
Não diretamente. BIC se concentra em cabeçalhos HTTP. No entanto, o gerenciamento de bots (empresarial) mais amplo da Cloudflare examina as impressões digitais JA3/JA4 TLS separadamente do BIC.
Se eu passar no BIC, ainda receberei CAPTCHAs?
Sim. Os desafios BIC e CAPTCHA são camadas independentes. Passar no BIC significa que seus cabeçalhos parecem legítimos. Você ainda pode acionar um CAPTCHA a partir das regras WAF, pontuação de bot ou modo IUAM.
CaptchaAI ajuda com BIC?
Não – o BIC não apresenta um desafio solucionável. Corrija seus cabeçalhos HTTP para passar o BIC. CaptchaAI lida com desafios CAPTCHA (Turnstile, desafios JavaScript, desafios gerenciados) que aparecem após a aprovação do BIC.
Como os cabeçalhos Sec-Fetch afetam o BIC?
O Chrome moderno envia cabeçalhos Sec-Fetch-* automaticamente. A ausência deles nem sempre aciona o BIC, mas incluí-los torna seu perfil de solicitação mais consistente com um navegador real.
Resumo
A verificação de integridade do navegador da Cloudflare bloqueia solicitações com cabeçalhos obviamente não relacionados ao navegador (403), enquanto os desafios CAPTCHA apresentam tarefas solucionáveis (503). O BIC é corrigido usando cabeçalhos adequados, semelhantes aos do navegador - nãoCaptchaAInecessário. Os desafios CAPTCHA requerem o Turnstile do CaptchaAI ou o solucionador Cloudflare Turnstile em staging. Sempre diagnostique primeiro o tipo de bloco: corrija cabeçalhos para BIC, use CaptchaAI para CAPTCHAs e altere IPs para blocos rígidos.
Artigos relacionados
- Cloudflare Turnstile em staging vs detecção de catraca
- Comparação de Geetest vs Cloudflare Turnstile
- Desafio gerenciado versus interativo da Cloudflare