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-Encodingbaş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 Zorluk →
turnstileyöntemi. - JavaScript / Etkileşimli Zorluk ("tarayıcınız kontrol ediliyor") →
cloudflare_challengeyö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.