1 · WAF challenge sayfaları EDGE · karar Cloudflare'de
Üç yol, üç WAF custom rule aksiyonu. Sekmede aç → interstitial'ı görürsünüz, geçince Worker'ın "geçildi" sayfası gelir. fetch ile çağır → aynı URL'ye tarayıcının kendi fetch'i; edge 403 + cf-mitigated: challenge + HTML döner, çünkü fetch bir challenge sayfasını çözemez. curl de aynı 403'ü alır.
Managed Challenge managed_challenge
Cloudflare sinyallere göre karar verir: çoğu insan etkileşimsiz geçer, şüpheli trafik checkbox görür. Önerilen aksiyon.
Sekmede aç /waf/managedHenüz istek yok.
JS Challenge js_challenge
Non-interactive: tarayıcıda JS çalışır, kullanıcı hiçbir şey yapmaz (~5 s bekleme). En düşük clearance seviyesi.
Sekmede aç /waf/jsHenüz istek yok.
Interactive Challenge challenge
Her zaman etkileşim ister (checkbox). En yüksek clearance seviyesi; managed pre-clearance bunu geçmez.
Sekmede aç /waf/interactiveHenüz istek yok.
Henüz istek yok. /api/protected bir JSON API'si ama kural onu da challenge'a sokar → fetch'e HTML gelir. Çözüm: bölüm 4 (pre-clearance).
2 · Turnstile modları ORIGIN · karar Worker'da (siteverify)
Widget sayfaya gömülür, sayfa erişimini engellemez. Çözülünce bir token üretir (300 s ömür, tek kullanım). Token'ı tarayıcı değil backend doğrular: Worker → siteverify. Mod widget'a bağlıdır (her mod = ayrı sitekey).
Managed mode: managed
Sinyallere göre etkileşimsiz ya da checkbox. Önerilen.
—
Non-interactive mode: non-interactive
Görünür ama etkileşimsiz; spinner → Success. Etkileşim gerekirse başarısız olur.
—
Invisible mode: invisible
Hiç görünmez. Burada execution: 'execute' ile isteğe bağlı çalıştırılır (gizlilik politikasına Turnstile eki gerekir).
—
3 · Test anahtarları deterministik
Cloudflare'in sabit test sitekey/secret'ları: hesap gerekmez, dummy token üretir. Durumları tekrarlanabilir göstermek için. Secret seçici Worker'daki secret'ı test değerleriyle değiştirir.
1x…AA hep geçer
—
2x…AB hep başarısız
—
3x…FF interaktif zorlar
—
4 · Pre-clearance köprüsü Turnstile → cf_clearance → WAF
Bu widget clearance_level: managed ile oluşturuldu: çözülünce token'ın yanında tarayıcıya cf_clearance cookie'si de verilir. Böylece SPA/fetch istekleri challenge sayfasına takılmaz. Cookie HttpOnly'dir, tarayıcının gerçek UA'sına bağlıdır ve seviye hiyerarşisi vardır: managed ≥ jschallenge geçer, interactive geçmez.
Beklenen: ③ 200 · /waf/js 200 (managed ≥ jschallenge) · /waf/interactive 403 challenge (interactive > managed). Not: fetch UA'yı değiştirmez — cf_clearance tarayıcının gerçek UA'sına bağlı.
5 · Origin ne görür? /whoami
Worker'a ulaşan istek WAF'ı geçmiştir. cf_clearance değeri JS'den okunamaz (HttpOnly); Worker'a iletilip iletilmediği cfClearanceCookieSeen alanında görünür. Gerçek cookie'yi DevTools → Application → Cookies'te görün.
—
6 · curl köşesi tarayıcı olmadan
Managed Challenge'ı curl geçemez (tarayıcı yok). Turnstile'da ise 403'ü Worker verir; cf-mitigated yoktur. Klasik form örneği → /ts/form
U=https://challengedemo.techdatademolab.com
curl -sD - $U/waf/managed -o /dev/null | grep -iE '^(HTTP|cf-mitigated|content-type)' # 403, challenge, text/html
curl -sD - $U/api/protected -H 'accept: application/json' -o /dev/null | grep -iE '^(HTTP|cf-mitigated)'
curl -s -X POST $U/turnstile/verify -H 'content-type: application/json' -d '{}' # 403 turnstile_token_required (origin)
curl -s -X POST $U/turnstile/verify -H 'content-type: application/json' \
-d '{"token":"XXXX.DUMMY.TOKEN.XXXX","widget":"test-pass"}' # 200 success:true (test secret)
curl -s -X POST $U/turnstile/verify -H 'content-type: application/json' \
-d '{"token":"XXXX.DUMMY.TOKEN.XXXX","widget":"test-pass","secret":"3x"}' # timeout-or-duplicate
bash scripts/test-matrix.sh # hepsi birden