Turnstile
Kullanıcıya bulmaca çözdürmeyen CAPTCHA alternatifi. Cloudflare'de olmayan sitelerde de çalışıyor ve challenge sayısı sınırsız — ücretsiz.
- DurumGenel kullanımda
- FiyatÜcretsiz — challenge ve doğrulama isteği sayısı sınırsız, kullanım bazlı faturalama yok
- Ücretsiz katmanvar
- Doğrulama
Turnstile nedir?
“Cloudflare’s smart CAPTCHA alternative.”
“Turnstile can be embedded into any website without sending traffic through Cloudflare and works without showing visitors a CAPTCHA.”
Klasik bir CAPTCHA insana soru soruyor: trafik ışıklarını seç, bozuk yazıyı oku. Turnstile tarayıcıya soru soruyor:
“First, we run a series of small non-interactive JavaScript challenges to gather signals about the visitor or browser environment.”
“These challenges include proof-of-work (computational puzzles), proof-of-space, probing for web APIs, and various other challenges for detecting browser-quirks and human behavior. As a result, we can fine-tune the difficulty of the challenge to the specific request and avoid showing a visual or interactive puzzle to a user.”
Ve veri işleme tarafında net bir sınır çiziliyor:
“Turnstile processes only the data strictly necessary to provide this security function. Turnstile does not access, store, or transmit user communications, form entries, or other page inputs.”
Nasıl çalışır?
Üç widget modu
| Mod | Tanım | Ne zaman |
|---|---|---|
| Managed (önerilen) | “Automatically chooses between non-interactive or checkbox challenge based on visitor risk level. No images or text to decipher.” | “Simple setup with adaptive security. Balances protection and user experience.” |
| Non-Interactive | “Displays visible widget with loading spinner. Runs challenges without requiring visitor interaction.” | “Minimize friction while showing verification is occurring.” |
| Invisible | “Runs challenges completely in the background with no visible widget or loading indicators.” | “Maximize visual experience with zero visible verification elements.” |
Managed modun en kötü durumu tek bir onay kutusu — “Turnstile will only require interaction if a further check is necessary… the visitor will be prompted to select a box.” Görsel bulmaca hiç yok. reCAPTCHA veya hCaptcha’nın resim ızgaralarına kıyasla bu, erişilebilirlik açısından gerçek bir fark.
Widget hata durumları — sorun giderirken işine yarayacak:
| Durum | Anlamı |
|---|---|
| Unknown error | “When an unknown error occurs during the challenge” — sayfayı yenile |
| Interaction timed out | Onay kutusu gösterildi ama kullanıcı uzun süre etkileşmedi |
| Challenge timed out | “the verification was completed but no further action has been taken” — örneğin giriş sayfasında Turnstile çözüldü ama kullanıcı uzun süre giriş yapmadı |
| Outdated or unsupported browser | Eski veya desteklenmeyen tarayıcı |
İki anahtar ve zorunlu sunucu doğrulaması
| Bileşen | Tanım |
|---|---|
| Sitekey | “Public key used to invoke the Turnstile widget on your site.” |
| Secret key | “Private key used for server-side token validation.” |
Widget challenges.cloudflare.com üzerinden yükleniyor — CSP kullanıyorsan bu alan adına izin vermen
gerekiyor.
Siteverify: POST https://challenges.cloudflare.com/turnstile/v0/siteverify
| Parametre | Zorunlu | Tanım |
|---|---|---|
secret | ✅ | “Your widget’s secret key from the Cloudflare dashboard” |
response | ✅ | “The token from the client-side widget” |
remoteip | ✘ | “The visitor’s IP address” |
idempotency_key | ✘ | “A UUID you generate to safely retry validation requests” |
Hem application/x-www-form-urlencoded hem application/json kabul ediyor, her zaman JSON dönüyor.
Yanıt:
{
"success": true,
"challenge_ts": "2026-09-01T15:14:30.096Z",
"hostname": "ornek.com.tr",
"error-codes": [],
"action": "giris",
"cdata": "oturum-123456789",
"metadata": { "ephemeral_id": "x:9f78e0ed210960d7693b167e" }
}
Hata kodları:
| Kod | Anlamı |
|---|---|
missing-input-secret / invalid-input-secret | Secret eksik veya geçersiz |
missing-input-response / invalid-input-response | Token eksik, bozuk veya süresi geçmiş |
bad-request | İstek biçimi hatalı |
timeout-or-duplicate | “Token has already been validated” — tekrar kullanım |
internal-error | İç hata, yeniden dene |
Idempotency: ağ hatası sonrası aynı token’ı yeniden doğrularken sahte bir
timeout-or-duplicate almamak için bir UUID üretip tüm denemelerde aynısını gönderiyorsun.
Cloudflare’in kendi örneği UUID’yi döngünün dışında üretiyor ve üstel geri çekilme kullanıyor.
Anahtarın sunucu tarafında ne kadar saklandığı belgelenmemiş.
action ve cData:
action— “A customer value that can be used to differentiate widgets under the same sitekey in analytics… up to 32 alphanumeric characters including_and-.”cData— “A customer payload that can be attached to the challenge throughout its issuance and which is returned upon validation… up to 255 alphanumeric characters including_and-.”
“Caution — Both
actionandcDatafields only accept alphanumeric characters, underscores (_), and hyphens (-).”
Form entegrasyonu varsayılanları: gizli alan otomatik oluşuyor (response-field: true), adı
cf-turnstile-response. Yenileme davranışı: refresh-expired varsayılan auto, retry varsayılan
auto, retry-interval varsayılan 8000 ms (maks 900000).
Hostname yönetimi
“By default, every widget requires at least one hostname to be configured. You cannot create a widget without specifying at least one authorized hostname.”
“Wildcard characters (such as
*) are not supported in the hostname field. However, adding a hostname automatically authorizes all of its subdomains.”
| Eklediğin | Kapsanan | Kapsanmayan |
|---|---|---|
ornek.com.tr | ornek.com.tr, www.ornek.com.tr, shop.ornek.com.tr, a.b.ornek.com.tr | başka alan adları |
www.ornek.com.tr | www.ornek.com.tr, abc.www.ornek.com.tr | ornek.com.tr, panel.ornek.com.tr |
Geçersiz biçimler: şema (http://ornek.com.tr), port (ornek.com.tr:443), yol
(ornek.com.tr/giris).
Pre-clearance ve WAF ilişkisi
Ücretsiz planda da var — plan tablosunda “Pre-clearance support | Yes | Yes”.
“Pre-clearance allows Turnstile to issue clearance cookies that can be used across your Cloudflare-protected domains.”
Nasıl çalışıyor:
- Zone’undaki bir WAF kuralı normalde ziyaretçiyi tam sayfa bir Cloudflare challenge ekranıyla kesiyor.
- Turnstile pre-clearance modunda yapılandırıldığında, sayfa içindeki widget’ı çözmek aynı
zamanda o zone için
cf_clearanceçerezini üretiyor. - Sonraki isteklerde bu çerez WAF’ın challenge şartını karşılıyor — araya giren ekran hiç çıkmıyor.
Asıl kullanım senaryosu:
“Integrate Cloudflare challenges on single-page applications (SPAs) by allowing Turnstile to issue a Pre-Clearance cookie.”
Pre-clearance olmadan bir SPA’nın fetch() çağrısı WAF challenge’ına takıldığında JSON yerine HTML
challenge sayfası dönüyor ve uygulama kırılıyor.
İçerik Güvenlik Politikası
“Cloudflare recommends using the nonce-based approach documented with CSP3… Turnstile works with
strict-dynamic.”
Alternatif:
Content-Security-Policy:
script-src https://challenges.cloudflare.com;
frame-src https://challenges.cloudflare.com;
connect-src 'self'; /* pre-clearance kullanıyorsan */
Ve bir kısıt: “You cannot set your own CSP and/or Referer-Policy via meta tags or Transform rules in challenge pages.”
Sınırlar
| Ücretsiz | Enterprise | |
|---|---|---|
| Widget sayısı | 20 | sınırsız |
| Widget başına hostname | 10 | 200 |
| Challenge / doğrulama isteği | sınırsız | sınırsız |
| Analitik geriye bakış | 7 gün | 30 gün |
| Any Hostname | ✘ | ✅ |
| Ephemeral ID | ✘ | ✅ |
| Cloudflare markasını kaldırma | ✘ | ✅ |
| Pre-clearance | ✅ | ✅ |
| Token ömrü | 300 sn | 300 sn |
| Token uzunluğu | 2.048 karakter | 2.048 karakter |
Ne zaman kullanılır, ne zaman kullanılmaz
Kullanılır
- Cloudflare’de olmayan bir sitede form koruması istiyorsan. Bu, ürünün en ayırt edici yanı.
- Kayıt, giriş, iletişim ve yorum formlarında. Klasik CAPTCHA’nın yerini alıyor ve kullanıcıya bulmaca çözdürmüyor.
- Bir SPA’de WAF challenge’ı
fetch()çağrılarını kırıyorsa. Pre-clearance belgelenmiş çözüm. - Erişilebilirlik önemliyse. Managed modda en kötü durum bir onay kutusu; resim ızgarası yok.
- Bütçe sıfırsa. Challenge sayısı sınırsız ve ölçümlü faturalama yok.
Kullanılmaz
Sunucu tarafı doğrulama yazamayacaksan. Widget tek başına hiçbir şey korumuyor. siteverify çağıramıyorsan bu ürünü kurmanın anlamı yok.
Native mobil uygulamada SDK bekliyorsan. WebView zorunlu; resmî native SDK yok.
file:// veya başka bir protokolde. “Turnstile is designed to function only on pages using
http:// or https://.”
Bot yönetimi bekliyorsan. Turnstile bir anı doğruluyor — o istek insan mı. Sürekli bot skorlaması, AI crawler yönetimi ve endpoint bazlı politika için Bot Management gerekiyor.
Hız sınırlama yerine. Turnstile “bu bir insan mı” sorusuna cevap veriyor, “bu istemci çok mu hızlı” sorusuna değil. İkincisi Rate Limiting.
Çözülen challenge’ı insanlık kanıtı sayacaksan. “A ‘solved’ Turnstile challenge does not automatically confirm the visitor is human… Bots might complete challenges, but Cloudflare can detect bot-like signals and mark the token as invalid.”
WCAG seviyesine sözleşmede dayanacaksan. İki resmî sayfa AA ve AAA diyor; teyit almadan bir ihaleye yazma.
20 widget’tan fazlasına ihtiyacın varsa ve Enterprise değilsen. Çok müşterili bir SaaS’ta bu sınır çabuk doluyor.
Somut örnekler
İstemci tarafı
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
<form method="POST" action="/kayit">
<input type="email" name="eposta" required />
<div class="cf-turnstile"
data-sitekey="SITEKEY"
data-action="kayit"
data-cdata="kampanya-2026"
data-language="tr"
data-theme="auto"></div>
<button type="submit">Kaydol</button>
</form>
Gizli alan otomatik oluşuyor: cf-turnstile-response.
Sunucu tarafı doğrulama (tam kontrol listesiyle)
async function turnstileDogrula(token, istemciIp, beklenenAction, beklenenHostname) {
const govde = new URLSearchParams();
govde.append("secret", process.env.TURNSTILE_SECRET);
govde.append("response", token);
if (istemciIp) govde.append("remoteip", istemciIp);
govde.append("idempotency_key", crypto.randomUUID());
const yanit = await fetch(
"https://challenges.cloudflare.com/turnstile/v0/siteverify",
{ method: "POST", body: govde }
);
const d = await yanit.json();
if (!d.success) return { gecerli: false, sebep: d["error-codes"] };
// Cloudflare bunları senin adına DOĞRULAMIYOR — kendin karşılaştır
if (beklenenAction && d.action !== beklenenAction)
return { gecerli: false, sebep: "action_uyusmuyor" };
if (beklenenHostname && d.hostname !== beklenenHostname)
return { gecerli: false, sebep: "hostname_uyusmuyor" };
return { gecerli: true, cdata: d.cdata, zaman: d.challenge_ts };
}
Yeniden deneme — idempotency anahtarı döngü DIŞINDA
async function tekrarliDogrula(token, istemciIp, maksDeneme = 3) {
const anahtar = crypto.randomUUID(); // her denemede AYNI anahtar
for (let deneme = 0; deneme < maksDeneme; deneme++) {
try {
return await siteverify(token, istemciIp, anahtar);
} catch (e) {
if (deneme === maksDeneme - 1) throw e;
await new Promise((r) => setTimeout(r, Math.pow(2, deneme) * 1000));
}
}
}
Anahtarı döngünün içinde üretirsen ikinci deneme sahte bir timeout-or-duplicate alıyor.
Süresi dolan token’ı yenilemek
window.onloadTurnstileCallback = function () {
turnstile.render("#turnstile-kabi", {
sitekey: "SITEKEY",
language: "tr",
"expired-callback": () => turnstile.reset(),
"timeout-callback": () => turnstile.reset(),
});
};
Cloudflare’in test anahtarları
| Sitekey | Davranış | Tip |
|---|---|---|
1x00000000000000000000AA | her zaman geçer | görünür |
2x00000000000000000000AB | her zaman düşer | görünür |
1x00000000000000000000BB | her zaman geçer | invisible |
2x00000000000000000000BB | her zaman düşer | invisible |
3x00000000000000000000FF | etkileşimi zorlar | görünür |
| Secret key | Davranış |
|---|---|
1x0000000000000000000000000000000AA | her zaman doğrular |
2x0000000000000000000000000000000AA | her zaman reddeder |
3x0000000000000000000000000000000AA | “token already spent” döndürür |
“Test sitekeys generate a dummy token:
XXXX.DUMMY.TOKEN.XXXX” “Test keys work on any domain, including:localhost,127.0.0.1,0.0.0.0”
Ve bir kural: test secret’ı yalnızca dummy token kabul ediyor, üretim secret’ı yalnızca gerçek token.
Demo 1: Cloudflare’den geçmeyen bir on-prem formda uçtan uca tur
Bu demonun değeri, ürünün en ayırt edici iddiasını kanıtlaması: site Cloudflare’de olmak zorunda değil.
Adım 1 — Cloudflare’den geçmediğini kanıtla
# On-prem sunucunun doğrudan IP'siyle, hiçbir proxy olmadan
dig +short ornek-onprem.local
curl -sS -D- -o /dev/null http://192.168.1.50:8080/kayit | grep -i "server:"
# Beklenen: nginx / Apache — "server: cloudflare" DEĞİL
Adım 2 — Widget’ı yerleştir
localhost test anahtarlarıyla değil, gerçek bir sitekey oluştur ve hostname’i ekle.
Adım 3 — Token’ı yakala
# Tarayıcı geliştirici araçlarında formu gönder ve gizli alanı oku
document.querySelector('[name="cf-turnstile-response"]').value.length
Adım 4 — siteverify’ı çağır
curl -sS -X POST "https://challenges.cloudflare.com/turnstile/v0/siteverify" \
-d "secret=$TURNSTILE_SECRET" \
-d "response=$TOKEN" \
-d "remoteip=203.0.113.10" | jq
Adım 5 — 🔴 Aynı token’ı ikinci kez gönder
curl -sS -X POST "https://challenges.cloudflare.com/turnstile/v0/siteverify" \
-d "secret=$TURNSTILE_SECRET" -d "response=$TOKEN" | jq '.["error-codes"]'
Adım 6 — Beş dakikayı bekle
TOKEN=$(...) # yeni bir token al
sleep 310
curl -sS -X POST ".../siteverify" -d "secret=$TURNSTILE_SECRET" -d "response=$TOKEN" | jq
Adım 7 — action ve hostname doğrulamasını kanıtla
İki widget oluştur (data-action="giris" ve data-action="kayit"), giriş widget’ından aldığın
token’ı kayıt uç noktasına gönder.
Adım 8 — Analytics’te sıfır kontrolü
Bu demoda ölçülenler:
| Ölçüt | Sonuç |
|---|---|
| Sunucu Cloudflare’de mi | hayır |
| Widget yüklendi mi | ✅ |
| Token uzunluğu | ≤ 2.048 |
| İlk siteverify | success: true |
| İkinci siteverify (aynı token) | timeout-or-duplicate |
| 310 sn sonra | reddediliyor |
Yanlış action ile | success: true — kendin kontrol etmelisin |
| Analytics Token Validation | > 0 |
Demo 2: Test anahtarlarıyla dört senaryoyu deterministik üretmek
Bu demo hiç gerçek trafiğe ihtiyaç duymuyor ve her seferinde aynı sonucu veriyor.
Adım 1 — Her zaman geçen widget
<div class="cf-turnstile" data-sitekey="1x00000000000000000000AA" data-language="tr"></div>
curl -sS -X POST ".../siteverify" \
-d "secret=1x0000000000000000000000000000000AA" \
-d "response=XXXX.DUMMY.TOKEN.XXXX" | jq
Adım 2 — Her zaman düşen widget
<div class="cf-turnstile" data-sitekey="2x00000000000000000000AB" data-language="tr"></div>
Adım 3 — Etkileşimi zorlayan widget
<div class="cf-turnstile" data-sitekey="3x00000000000000000000FF" data-language="tr"></div>
Adım 4 — “Harcanmış token” secret’ı
curl -sS -X POST ".../siteverify" \
-d "secret=3x0000000000000000000000000000000AA" \
-d "response=XXXX.DUMMY.TOKEN.XXXX" | jq
Adım 5 — Üretim ve test anahtarlarının karışmadığını göster
# Üretim secret'ı + dummy token → reddedilmeli
curl -sS -X POST ".../siteverify" -d "secret=$GERCEK_SECRET" \
-d "response=XXXX.DUMMY.TOKEN.XXXX" | jq '.["error-codes"]'
# Test secret'ı + gerçek token → reddedilmeli
curl -sS -X POST ".../siteverify" -d "secret=1x0000000000000000000000000000000AA" \
-d "response=$GERCEK_TOKEN" | jq '.["error-codes"]'
Adım 6 — Hostname kapsamını test et
Widget’a yalnızca www.ornek.com.tr ekle, sonra widget’ı çıplak ornek.com.tr üzerinde çalıştır.
Sonra ornek.com.tr ekle ve alt alan adlarının otomatik kapsandığını göster.
Bu demoda ölçülenler:
| Anahtar | Widget davranışı | siteverify sonucu |
|---|---|---|
1x…AA + 1x…AA | anında geçer | success: true |
2x…AB | hata durumu | — |
3x…FF | onay kutusu, Türkçe | success: true |
3x…AA secret | — | timeout-or-duplicate |
| Üretim secret + dummy token | — | reddediliyor |
| Test secret + gerçek token | — | reddediliyor |
www.x eklenmiş, çıplak x’te | çalışmıyor | — |
x eklenmiş, shop.x’te | çalışıyor | — |
Fiyatlandırma
| Ücretsiz | Enterprise | |
|---|---|---|
| Fiyat | Free | Contact Sales |
| Widget sayısı | 20 | sınırsız |
| Tüm widget tipleri | ✅ | ✅ |
| Sınırsız challenge (trafik veya doğrulama isteği) | ✅ | ✅ |
| Hostname yönetimi | widget başına 10 | widget başına 200 |
| Any Hostname | ✘ | ✅ |
| Analitik geriye bakış | 7 gün | 30 gün |
| Pre-clearance | ✅ | ✅ |
| Ephemeral ID | ✘ | ✅ |
| Offlabel (marka kaldırma) | ✘ | ✅ |
| WCAG 2.2 uyumu | ✅ | ✅ |
Ephemeral ID (yalnızca Enterprise): “Ephemeral IDs are dynamically generated for each Turnstile solve attempt. No cookies or local storage is required.… IDs expire within a few days and cannot be used to identify individual users.” Etkinleştirme kendi kendine yapılamıyor — hesap ekibi gerekiyor.
Lisanslama ve hukuki çerçeve
Hizmet tescillidir ve Cloudflare Hizmet Şartları’na tabidir.
KVKK açısından güçlü dayanak. Turnstile’ın veri işleme sınırı açıkça yazılı:
“Turnstile processes only the data strictly necessary to provide this security function. Turnstile does not access, store, or transmit user communications, form entries, or other page inputs.”
Yani formdaki kişisel veriler Cloudflare’e gitmiyor — yalnızca tarayıcı ortamı sinyalleri ve
(gönderirsen) remoteip. Bu, bir CAPTCHA çözümü için oldukça dar bir kapsam ve aydınlatma metninde
somut olarak yazılabilir.
remoteip isteğe bağlı. Ziyaretçinin IP adresini siteverify’a göndermek zorunlu değil. Veri
minimizasyonu açısından göndermemeyi tercih edebilirsin; doğrulama yine çalışıyor. Gönderirsen bir
kişisel veri aktarımı yapmış oluyorsun.
Ephemeral ID. Enterprise’da açılan bu özellik bile gizlilik odaklı tasarlanmış: çerez veya yerel depolama kullanmıyor, hesabına özgü ve “expire within a few days and cannot be used to identify individual users.”
Sık yapılan hatalar
siteverify’ı hiç çağırmamak. Widget tek başına hiçbir şey korumuyor. Analytics’te Token Validation sıfırsa durum budur.
action ve hostname alanlarını doğrulamamak. Cloudflare bunları döndürüyor ama zorlamıyor.
Aynı token’ı ikinci kez doğrulamak. timeout-or-duplicate.
Idempotency anahtarını yeniden deneme döngüsünün içinde üretmek. Sahte timeout-or-duplicate
alıyorsun.
Beş dakikalık pencereyi hesaba katmamak. Uzun formlarda expired-callback ile
turnstile.reset() çağır.
action veya cData’ya Türkçe karakter, boşluk veya nokta koymak. Yalnızca alfanümerik, _ ve
-.
Hostname’e www yazıp çıplak alan adını unutmak. Alt alan adları otomatik kapsanıyor ama üst
alan adı kapsanmıyor.
Hostname’e şema, port veya yol yazmak. Geçersiz.
Any Hostname’i açıp hostname doğrulamasını yazmamak. Koruma tamamen kalkıyor.
CSP’ye challenges.cloudflare.com eklemeyi unutmak. Widget hiç yüklenmiyor.
Pre-clearance kullanıp connect-src 'self' eklememek. cf_clearance çerezi sessizce kurulmuyor.
Pre-clearance’ta yanlış zone’u seçmek. Alt alan adı ayrı bir zone ise o zone’u seçmen gerekiyor.
Native mobil SDK aramak. Yok; WebView kullan.
Çözülen challenge’ı insanlık kanıtı saymak. “does not automatically confirm the visitor is human.”
Test ve üretim anahtarlarını karıştırmak. Test secret’ı yalnızca dummy token, üretim secret’ı yalnızca gerçek token kabul ediyor.
Sıkça sorulan sorular
- Sitem Cloudflare'de değil, kullanabilir miyim?
- Evet — ve bu ürünün en değerli özelliği. Birebir: “Turnstile is designed to be an independent service. You can use Turnstile on any website, regardless of whether it is proxied through the Cloudflare network. This allows for flexible deployment across multi-cloud environments, on-premises infrastructure, or sites using other CDNs. The client-side widget and server-side validation steps are completely self-contained.” Cloudflare hesabı gerekiyor ama Cloudflare DNS'i veya proxy'si gerekmiyor.
- Widget'ı koydum, formum korunuyor mu?
- Hayır. Birebir: “Mandatory server-side validation — You must call the Siteverify API to complete your Turnstile implementation. The client-side widget alone does not protect your forms.” Üç sebep sayılıyor: token'lar taklit edilebiliyor, süreleri doluyor ve tek kullanımlık. Analytics'te Token Validation sayın sıfırsa siteverify'ı hiç çağırmıyorsun demektir.
- Token ne kadar geçerli?
- 300 saniye (5 dakika) ve tek kullanımlık. Maksimum uzunluk 2.048 karakter. Süresi geçmiş veya ikinci kez gönderilmiş token
timeout-or-duplicatehatasıyla reddediliyor. Kullanıcı formu beş dakikadan geç gönderirse widget'ıturnstile.reset()ile yenilemen gerekiyor. - Üç widget modunun farkı ne?
- Managed (önerilen) — “Automatically chooses between non-interactive or checkbox challenge based on visitor risk level. No images or text to decipher.” En kötü durumda tek bir onay kutusu, asla görsel bulmaca. Non-Interactive — yükleme göstergeli görünür widget, kullanıcı hiç etkileşmiyor. Invisible — hiçbir görsel iz yok.
- Invisible modun hukuki bir şartı var mı?
- Evet. Birebir: “As a condition of enabling invisible mode, you must reference Cloudflare's Turnstile Privacy Addendum in your own privacy policy.” Bu bir tavsiye değil, kullanım şartı. KVKK aydınlatma metnini hazırlarken bunu atlamaman gerekiyor.
- Türkçe destekleniyor mu?
- Evet. Desteklenen 39 dil arasında
tr-tr/trvar. Varsayılanauto— “to use the language that the visitor has chosen”. Zorlamak içindata-language="tr". - <code>action</code> ve <code>cData</code> alanları ne işe yarıyor?
actionanalitikte widget'ları ayırmak için (maks 32 karakter),cDataise doğrulamada geri dönen özel yük (maks 255 karakter). İkisi de yalnızca alfanümerik, alt çizgi ve tire kabul ediyor. Kritik: Cloudflare bunları senin adına zorlamıyor — sunucu tarafındaactionvehostnamealanlarını kendin karşılaştırman gerekiyor.- Kaç widget ve hostname oluşturabilirim?
- Ücretsiz: 20 widget, widget başına 10 hostname, analitik 7 gün. Enterprise: sınırsız widget, widget başına 200 hostname, analitik 30 gün. Challenge ve doğrulama isteği sayısı ikisinde de sınırsız.
- Hostname'de wildcard kullanabilir miyim?
- Hayır ama gerek de yok. Birebir: “Wildcard characters (such as
*) are not supported… However, adding a hostname automatically authorizes all of its subdomains.”ornek.com.treklersenwww,shop,a.b.ornek.com.trhepsi kapsanıyor. Amawww.ornek.com.treklersen çıplak alan adı kapsanmıyor. Şema, port ve yol geçersiz. - siteverify'ın hız limiti var mı?
- Cloudflare yayımlamıyor — doğrulanamadı. Turnstile dokümantasyonunun tamamı tarandı; Cloudflare tarafından uygulanan bir siteverify hız limiti geçmiyor. Dikkat:
api.cloudflare.comiçin geçerli olan “5 dakikada 1.200 istek” limiti farklı bir host'a ait (challenges.cloudflare.comdeğil) ve siteverify'a uygulanmaz. - Mobil uygulamamda kullanabilir miyim?
- Yalnızca WebView ile. Birebir: “For native mobile applications, Turnstile does not run natively. Instead, you use a WebView… to load a webpage that contains the Turnstile widget.” Resmî bir iOS veya Android native SDK yok. WebView'da JavaScript ve DOM storage açık olmalı,
challenges.cloudflare.com'a erişim gerekiyor. - Erişilebilirlik seviyesi ne?
- İki resmî sayfa çelişiyor ve ikisi de aynı tarihli. Ana doküman sayfası “Turnstile is WCAG 2.2 AA compliant” diyor; plan tablosu ise “WCAG 2.2 AAA compliance | Yes | Yes” diyor. AA ile AAA farklı uyum seviyeleri. Bir ihale veya sözleşme gereksinimi için bu seviyeye güveniyorsan Cloudflare'den yazılı teyit al.
- Pre-clearance nedir, Enterprise mi gerektiriyor?
- Ücretsiz planda da var — yaygın bir yanlış inanış. Turnstile çözüldüğünde
cf_clearanceçerezi de üretiliyor ve zone'undaki WAF challenge'ını karşılıyor. Asıl kullanım senaryosu: “Integrate Cloudflare challenges on single-page applications (SPAs)” — challenge sayfaları HTML döndürdüğü içinfetch()çağrılarını kırıyor, pre-clearance bunu çözüyor. Tek istisna: bu, Turnstile'ın Cloudflare zone'u gerektiren tek özelliği. - Challenge çözüldü, kullanıcı insan mı?
- Hayır — bu doğrudan uyarılıyor. Birebir: “A ‘solved' Turnstile challenge does not automatically confirm the visitor is human. You must call the Siteverify API to validate the token and proceed only if the response returns
success:true.” Ve: “Bots might complete challenges, but Cloudflare can detect bot-like signals and mark the token as invalid.” - Gerçekten ücretsiz mi?
- Evet. Plan tablosunda “Unlimited challenges (traffic or verification requests)” hem Free hem Enterprise için Yes. Ayrıca
/billing/understand/usage-based-billing/tablosunda hiç geçmiyor vecloudflare.com/plans/sayfasında bir plan satırı olarak yok. Enterprise katmanı yalnızca beş şey ekliyor: sınırsız widget, 200 hostname, Any Hostname, Ephemeral ID ve Cloudflare markasını kaldırma.
İlgili servisler
- Bot ManagementHer request’e bot skoru verir; kazıyıcı, kimlik doldurma ve stok kapma trafiğini ayırır.
- WAFSQL injection, XSS ve bilinen zafiyet istismarlarını request origin’e ulaşmadan engeller.
- Rate LimitingIP, oturum veya özel anahtara göre request sayısını sınırlar.
- WorkersJavaScript/TypeScript/Python kodunu Cloudflare’in 330+ şehirdeki sunucularında, sunucu yönetmeden çalıştırır.
Bu sayfadaki fiyat ve özellik bilgileri 1 Eylül 2026 tarihinde Cloudflare’in resmî kaynaklarından doğrulanmıştır. Cloudflare fiyatlandırmasını önceden haber vermeden değiştirebilir; bağlayıcı bilgi içinresmî sayfaya bakın.