CHALLENGEDEMO
Aynı zone, iki mekanizma: Managed Challenge = "bu isteğe erişim izni var mı?" (edge, istek bazlı, interstitial)  |  Turnstile = "bu eylemi bir insan mı yapıyor?" (sayfa içi, eylem bazlı, token + siteverify)
Challenge Passage (challenge_ttl): 1800 s · cf_clearance ömrü

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/managed
—
Henü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/js
—
Henü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/interactive
—
Henü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.

bekleniyor…
—

Non-interactive mode: non-interactive

Görünür ama etkileşimsiz; spinner → Success. Etkileşim gerekirse başarısız olur.

bekleniyor…
—

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).

(görünmez widget burada)
bekleniyor (execute)…
—

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.

→ 403 challenge beklenir
② widget'ı çözün…
—
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