Comparisons

Cloudflare Browser Integrity Check vs CAPTCHA Challenge

Kalau script scraping Anda balas dengan 403, jangan langsung mencari solver CAPTCHA — kemungkinan besar itu Browser Integrity Check (BIC), bukan challenge yang bisa diselesaikan. BIC adalah pemeriksaan pasif di level header: Cloudflare menolak request yang jelas bukan browser dan langsung membalas 403, tanpa menyajikan tugas apa pun. Yang membalas 503 justru CAPTCHA challenge (Turnstile, JavaScript challenge, atau Managed Challenge) yang memang dirancang untuk diselesaikan browser sah. Aturan praktisnya: 403 diperbaiki dengan header yang benar, 503 diselesaikan dengan solver.


Ringkasan perbedaan BIC dan CAPTCHA challenge

Fitur Browser Integrity Check CAPTCHA Challenge
Apa yang diperiksa Hanya header HTTP Perilaku browser + lingkungan
Butuh JavaScript? Tidak (level header) Ya
Yang dilihat pengguna Tidak ada (lolos) atau 403 (gagal) Widget challenge atau halaman JS
Status HTTP saat gagal 403 503
Bisa diselesaikan? Tidak — perbaiki header Ya — selesaikan CAPTCHA
Cookie diterbitkan Tidak qa_validation_cookie
Butuh CaptchaAI? Tidak — perbaiki header request Ya
Aktif secara default Ya (semua paket Cloudflare) Tidak (dikonfigurasi per aturan WAF)
Berlaku untuk Setiap request Hanya yang cocok aturan WAF

Pegangan cepat:

  • 403 hampir selalu soal header — tambal di sisi klien, tanpa solver.
  • 503 butuh penyelesaian CAPTCHA lewat CaptchaAI.
  • 403 di semua kombinasi header biasanya berarti IP-nya yang bermasalah.

Cara kerja Browser Integrity Check (BIC)

BIC mengevaluasi header request HTTP untuk menyaring traffic non-browser, dan berjalan sebelum challenge apa pun muncul. Karena murni berbasis header, klien HTTP polos seperti requests atau axios hampir selalu tersangkut di sini.

Sinyal yang dievaluasi BIC

Pemeriksaan Yang dicari Kegagalan umum
Validasi User-Agent UA hilang, kosong, atau masuk daftar buruk python-requests/2.31, curl, wget
Urutan header Header dalam urutan yang tidak wajar Library HTTP non-browser
Header browser hilang Accept, Accept-Language, Accept-Encoding tidak ada Klien HTTP minimal
Signature bot yang dikenal UA spammer, UA scanner Googlebot dari IP non-Google
Blocklist IP abusif IP berbahaya yang sudah dikenal IP pusat data yang masuk daftar blokir

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

Melewati BIC dengan header yang benar

BIC lolos begitu request membawa header seperti browser sungguhan:

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)

Versi Node.js dengan Axios memakai header yang sama:

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;
}

Cara kerja CAPTCHA challenge

CAPTCHA challenge baru berjalan setelah BIC lolos, dan tidak seperti BIC, ia menuntut eksekusi JavaScript. Untuk Turnstile dan Managed Challenge, CaptchaAI memakai metode turnstile; untuk JavaScript dan Interactive Challenge, metode cloudflare_challenge.

Jenis Cloudflare CAPTCHA challenge

Tipe challenge Pemicu Terlihat pengguna? Metode CaptchaAI
Widget Turnstile Disematkan di halaman oleh developer Widget pada form turnstile
Managed Challenge Cocok aturan WAF Adaptif (invisible/checkbox) turnstile
JavaScript Challenge Mode IUAM atau aturan WAF Halaman "Checking your browser" cloudflare_challenge
Interactive Challenge Kecurigaan tinggi Challenge satu halaman penuh cloudflare_challenge

Setelah selesai, cookie sesi diterbitkan dan request berikutnya lolos:

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

Mendiagnosis: blok BIC atau CAPTCHA challenge?

Pastikan jenis bloknya lewat perbandingan status code:

  • Minimal 403, browser 200 → BIC saja, perbaiki header.
  • Browser 503 dengan halaman challenge → CAPTCHA challenge, butuh solver.
  • Kedua-duanya 403 → kemungkinan besar IP yang diblokir.

Fungsi berikut mengotomatiskannya:

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 validasi 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']}")

Empat pola blok tersering

Blok BIC saja — header minimal ditolak:

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

Fix: Add proper browser headers. No CaptchaAI needed.

BIC lolos, lalu CAPTCHA challenge muncul:

Request with Chrome UA → 503 (challenge page)

Fix: Headers are fine. Use CaptchaAI to solve the challenge.

BIC dan CAPTCHA sekaligus:

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

Fix: First fix headers, then solve CAPTCHA with CaptchaAI.

Blok IP — semua kombinasi header gagal:

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

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

Contoh nyata: tim price-monitoring di Jakarta

Sebuah agensi price-monitoring kecil menjalankan crawler dari region AWS ap-southeast-1 (Singapura). Beberapa target balas 403 sejak request pertama, dan timnya sempat mencoba solver — padahal diagnose_cloudflare_block menunjukkan header minimal 403 dan header browser 200: murni BIC. Cukup pasang User-Agent Chrome plus header Accept-*, target lolos tanpa solver. Situs lain membalas 503, dan di sinilah CaptchaAI masuk lewat metode cloudflare_challenge — solver dipakai hanya saat ada challenge. Satu catatan kepatuhan: sesuai UU Pelindungan Data Pribadi (UU 27/2022), ambil hanya data yang berhak Anda proses.


Header yang aman dan header yang memicu blok

Kumpulan header ini cukup untuk melewati BIC pada mayoritas situs:

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"',
}

Sebaliknya, header berikut menandai request sebagai otomatisasi:

Header Kenapa gagal
User-Agent: python-requests/2.31.0 Identifier library HTTP yang dikenal
User-Agent: curl/7.81.0 Identifier CLI tool
Accept tidak ada Tidak ada browser yang menghilangkan Accept
Accept-Language tidak ada Semua browser mengirimkannya
User-Agent: "" (kosong) Tidak valid — otomatisasi yang kentara
User-Agent: Googlebot/2.1 dari IP non-Google Identitas bot palsu

Pemecahan masalah cepat

Gejala Penyebab Solusi
403 dengan header minimal, 200 dengan header browser BIC saja Pakai header seperti browser
403 di semua kombinasi header IP diblokir atau aturan WAF Coba IP atau proxy lain
503 dengan halaman challenge CAPTCHA challenge (bukan BIC) Pakai CaptchaAI
403 sesekali Rate limiting atau berbasis sesi Turunkan laju request, pertahankan sesi
Header benar tapi tetap 403 Cek TLS sinyal browser (JA3) Pakai curl_cffi atau browser asli

Pertanyaan yang sering diajukan

Kenapa saya tetap dapat 403 padahal User-Agent sudah Chrome?

Header yang benar hanya mengurus BIC. Kalau header sudah rapi tapi masih 403, penyebab tersering adalah reputasi IP (IP pusat data yang masuk blocklist) atau cek TLS sinyal browser (JA3/JA4) pada Bot Management. Coba IP lain atau klien seperti curl_cffi.

Apakah CaptchaAI bisa mengatasi Browser Integrity Check?

Tidak. BIC tidak menyajikan challenge yang bisa diselesaikan, jadi perbaiki header HTTP Anda. CaptchaAI menangani CAPTCHA challenge (Turnstile, JavaScript challenge, Managed Challenge) yang muncul setelah BIC lolos.

Apakah IP pusat data cukup untuk melewati BIC?

Tidak selalu. Salah satu sinyal BIC adalah blocklist IP abusif, jadi IP pusat data dengan reputasi buruk bisa tetap kena 403 walau header sudah sempurna. Kalau semua kombinasi header gagal, masalahnya di IP, bukan header.

Berapa lama CaptchaAI menyelesaikan Cloudflare Challenge?

Pada tipe yang didukung, Cloudflare Turnstile umumnya rampung dalam waktu di bawah 10 detik dan Cloudflare Challenge di bawah 15 detik, dengan tingkat keberhasilan tinggi. Angka ini batas SLA, bukan rata-rata.


Ringkasan

Browser Integrity Check menolak request dengan header non-browser (403), sedangkan CAPTCHA challenge menyajikan tugas yang bisa diselesaikan (503). BIC ditambal cukup dengan header seperti browser yang benar, tanpa perlu layanan solver CaptchaAI; CAPTCHA challenge baru memerlukan metode Turnstile atau Cloudflare Challenge. Urutannya selalu sama: diagnosis dulu, perbaiki header untuk BIC, panggil CaptchaAI untuk CAPTCHA, dan ganti IP untuk hard block.


Artikel Terkait

Komentar dinonaktifkan untuk artikel ini.