Comparisons

Cloudflare Tarayıcı Bütünlük Kontrolü ile CAPTCHA doğrulaması farkı

Cloudflare'den dönen HTTP kodu, sorununuzu daha ilk bakışta sınıflandırır:

  • 403 → istek başlıklarınız tarayıcı gibi görünmüyor; düzeltme tamamen sizde, CaptchaAI gerekmez.
  • 503 → çözülebilir bir CAPTCHA doğrulaması var; bu noktada CaptchaAI devreye girer.

Bu iki katman sık sık karıştırılır; oysa Tarayıcı Bütünlük Kontrolü (BIC) ile CAPTCHA doğrulaması tamamen farklı mekanizmalardır. BIC, JavaScript bile çalıştırmadan yalnızca başlıklara bakan pasif bir filtredir; CAPTCHA doğrulaması ise tarayıcı davranışını ölçen, çözülmesi gereken aktif bir görevdir. Aşağıda ikisini nasıl ayırt edeceğinizi göreceksiniz.

BIC ile CAPTCHA doğrulaması: temel farklar

Özellik Tarayıcı Bütünlük Kontrolü CAPTCHA doğrulaması
Neyi denetler Yalnızca HTTP başlıkları Tarayıcı davranışı + ortam
JavaScript gerekir mi? Hayır (başlık düzeyi) Evet
Kullanıcı ne görür Hiçbir şey (geçti) ya da 403 (başarısız) Doğrulama widget'ı veya JS sayfası
Başarısızlıkta HTTP durumu 403 503
Çözülebilir mi? Hayır — başlıkları düzeltin, aksi hâlde bloke olur Evet — CAPTCHA'yı çözün
Çerez verilir mi Hayır qa_session_cookie
CaptchaAI gerekir mi? Hayır — istek başlıklarını düzeltin Evet
Varsayılan durumu Etkin (tüm Cloudflare planları) Kapalı (kural bazında yapılandırılır)
Kapsamı Her istek Yalnızca eşleşen WAF kuralları

Özetle 403 bir başlık sorunu, 503 ise bir çözüm görevidir; önce BIC değerlendirilir, ancak sonra bir CAPTCHA tetiklenebilir.

Tarayıcı Bütünlük Kontrolü (BIC) nedir?

BIC, tarayıcı dışı trafiği yakalamak için HTTP istek başlıklarını inceler ve her türlü JavaScript veya CAPTCHA doğrulamasından önce çalışır. Bu yüzden requests ya da axios ile atılan minimal bir istek çoğu zaman ilk adımda 403 ile döner.

BIC hangi başlıkları denetler?

Denetim Ne arar Sık görülen hatalar
User-Agent doğrulaması Eksik, boş veya bilinen kötü UA python-requests/2.31, curl, wget
Başlık sırası Alışılmadık sıradaki başlıklar Tarayıcı dışı HTTP kitaplıkları
Eksik tarayıcı başlıkları Accept, Accept-Language, Accept-Encoding eksik Minimum HTTP istemcileri
Bilinen bot imzaları Spam UA'ları, tarayıcı botu UA'ları Google dışı IP'lerden Googlebot
Kötüye kullanım IP kara listeleri Bilinen zararlı IP'ler Kara listedeki veri merkezi IP'leri

BIC akışı

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)

Doğru tarayıcı başlıklarını göndermek

BIC, gerçek bir tarayıcıya benzeyen başlıklar göndererek karşılanır. Burada çözülecek bir CAPTCHA yoktur; tek yapmanız gereken isteğinizin profilini bir tarayıcınınkine yaklaştırmaktır:

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 için başlık seti

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

BIC blokajını tetikleyen başlıklar

Şu değerler isteğinizi bir betiğe benzetir ve neredeyse her zaman 403 getirir:

Başlık Neden başarısız olur?
User-Agent: python-requests/2.31.0 Bilinen HTTP kitaplığı tanımlayıcısı
User-Agent: curl/7.81.0 CLI aracı tanımlayıcısı
Accept başlığı eksik Hiçbir tarayıcı Accept göndermeden geçmez
Accept-Language eksik Tüm tarayıcılar bunu gönderir
User-Agent: "" (boş) Geçersiz — apaçık otomasyon
Google dışı IP'den User-Agent: Googlebot/2.1 Sahte bot kimliği

CAPTCHA doğrulamaları

CAPTCHA doğrulamaları, BIC karşılandıktan sonra devreye girer. JavaScript'in çalışmasını gerektirir ve çözülebilir bir görev sunar:

Cloudflare CAPTCHA doğrulama türleri

Doğrulama türü Tetikleyici Kullanıcıya görünür mü? CaptchaAI yöntemi
Turnstile widget'ı Geliştirici tarafından sayfaya yerleştirilir Formdaki widget turnstile
Yönetilen Zorluk (Managed Challenge) WAF kuralı eşleşmesi Uyarlanabilir (görünmez/onay kutusu) turnstile
JavaScript Zorluğu IUAM veya WAF kuralı "Tarayıcınız kontrol ediliyor" sayfası cloudflare_challenge
Etkileşimli Zorluk Yüksek şüphe Tam sayfa doğrulama cloudflare_challenge

Turnstile ve Yönetilen Zorluk için turnstile, JavaScript ve Etkileşimli Zorluklar için cloudflare_challenge yöntemini kullanırsınız.

Doğrulama akışı (BIC'ten farkı)

Request passes BIC check
    ↓
WAF rules evaluate bot score, IP, path
    ↓
Rule triggers CAPTCHA challenge (HTTP 503)
    ↓
Browser executes JavaScript challenge
    ↓
Challenge solved → qa_session_cookie cookie issued
    ↓
Subsequent requests pass with cookie

BIC bloğunu CAPTCHA doğrulamasından ayırma

Bir isteğiniz engellendiğinde ilk iş engelin türünü tespit etmektir; düzeltmeyi belirleyen tek şey budur. Aynı URL'ye önce minimal, sonra tarayıcı başlıklarıyla iki istek atıp durum kodlarını karşılaştırı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 headers to QA tanılama 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 doğrulama akışı"
            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']}")

Belirtiden çözüme hızlı tablo

Belirti Sebep Düzeltme
Minimal başlıkla 403, tarayıcı başlığıyla 200 Yalnızca BIC Tarayıcı benzeri başlıklar kullanın
Her başlık kombinasyonuyla 403 IP bloklu veya WAF kuralı Farklı IP veya proxy deneyin
Doğrulama sayfasıyla birlikte 503 CAPTCHA doğrulaması (BIC değil) CaptchaAI kullanın
Aralıklı 403 Hız sınırlama veya oturum bazlı İstek oranını düşürün, oturumu koruyun
Başlıklar doğru ama yine de 403 TLS test profil yapılandırması kontrolü (JA3) curl_cffi veya gerçek tarayıcı kullanın

Sık karşılaşılan senaryolar

İstanbul'daki bir e-ticaret ekibi için Cloudflare arkasındaki bir staging ödeme akışını test ettiğinizi düşünün. Pratikte dört tablodan biriyle karşılaşırsınız:

Senaryo 1: Yalnızca BIC bloğu

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

Fix: Add proper browser headers. No CaptchaAI needed.

Senaryo 2: Önce BIC geçer, sonra CAPTCHA gelir

Request with Chrome UA → 503 (challenge page)

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

Senaryo 3: BIC ve CAPTCHA birlikte

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

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

Senaryo 4: Hiçbiri — IP bloğu

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

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

Başlık referansı: BIC'i karşılayan tam set

Üretimde işe yarayan başlık setini tek yerde toplayan referans; olduğu gibi kopyalayın:

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

Sık sorulan sorular

403 hatası mı yoksa CAPTCHA mı aldığımı nasıl anlarım?

Durum koduna bakın. Cloudflare BIC bloğu her zaman 403 döndürür ve hiçbir doğrulama sunmaz; bir CAPTCHA doğrulaması ise 503 ile birlikte "tarayıcınız kontrol ediliyor" sayfası veya bir Turnstile widget'ı getirir. Yukarıdaki diagnose_cloudflare_block fonksiyonu bu ayrımı sizin için otomatik yapar.

python-requests ile aldığım Cloudflare 403 hatasını nasıl çözerim?

Bu tipik bir BIC bloğudur; çözümü CAPTCHA değil, doğru başlıklardır. İsteğinize şunları ekleyin:

  • Gerçekçi bir User-Agent (güncel Chrome dizesi).
  • Accept, Accept-Language, Accept-Encoding başlıkları.
  • Modern Chrome'un otomatik yolladığı Sec-Fetch-* başlıkları.

Yukarıdaki CLOUDFLARE_SAFE_HEADERS sözlüğü doğrudan kullanabileceğiniz bir başlangıç noktasıdır.

BIC için CaptchaAI gerekiyor mu?

Hayır. BIC çözülebilir bir görev sunmadığı için burada CaptchaAI'nin yapabileceği bir şey yoktur — sadece HTTP başlıklarınızı düzeltin. CaptchaAI, BIC karşılandıktan sonra ortaya çıkan Turnstile ve Cloudflare doğrulama akışı gibi gerçek CAPTCHA'ları çözer.

Başlıklarım doğru olduğu hâlde neden hâlâ 403 alıyorum?

Başlıklar meşru görünüyorsa engel büyük olasılıkla başlık düzeyinde değildir. İlk şüpheli IP'nizdir: bir kara listedeyse aynı istek farklı bir IP'den geçebilir. İkinci olasılık TLS profilidir; Cloudflare JA3/JA4 imzanızı ayrıca incelediğinde curl_cffi veya gerçek bir tarayıcı isteğinizi bir tarayıcının profiline yaklaştırır.

Cloudflare doğrulamasını çözmek için hangi CaptchaAI yöntemini kullanmalıyım?

Sayfadaki türe bağlı:

  • Turnstile widget'ı / Yönetilen Zorlukturnstile yöntemi.
  • JavaScript / Etkileşimli Zorluk ("tarayıcınız kontrol ediliyor") → cloudflare_challenge yöntemi.

Tanı fonksiyonu, sayfa kaynağına bakarak hangisinin gerektiğini zaten bildirir.

Özet

Cloudflare'in Tarayıcı Bütünlük Kontrolü, tarayıcı dışı başlıklı istekleri baştan engeller (403); CAPTCHA doğrulaması ise çözülebilir bir görev sunar (503). BIC'in düzeltmesi tamamen sizde: doğru başlıkları gönderin, CaptchaAI gerekmez. CAPTCHA doğrulamaları ise CaptchaAI'nin turnstile ya da Cloudflare doğrulama akışı çözücüsünü gerektirir. Önce blok türünü teşhis edin: 403 için başlıkları düzeltin, 503 için CaptchaAI kullanın, kalıcı bloklar için IP değiştirin.

İlgili Makaleler

Bu makale için yorumlar devre dışı bırakılmıştır.