WAF
İmza tabanlı managed rule'lar, makine öğrenmesiyle üretilen attack score ve kendi yazdığın custom rule'lar. Ama Cloudflare kendi OWASP kural setini “yanlış pozitife yatkın” diye uyarıyor.
- DurumGenel kullanımda
- FiyatPlana dahil; malicious uploads ve Sensitive Data Detection Enterprise eklentisi
- Ücretsiz katmanvar
- Doğrulama
WAF nedir?
Cloudflare WAF iki rol üzerine kurulu ve bu ayrım ürünün tamamını anlamanın anahtarı:
“Detection: Run incoming requests through one or more traffic detections to find malicious or potentially malicious activity.”
“Mitigation: Blocks, challenges, or throttles requests through different mitigation features such as custom rules, Managed Rules, and rate limiting rules.”
Ana bileşenler:
“Managed Rules … signature-based rules created by Cloudflare that provide immediate protection against known attacks.” “Traffic detections … that enrich requests with metadata.” “User-defined rules for your specific needs, including custom rules and rate limiting rules.”
2026’da yedi tespit var: WAF attack score · Leaked credentials · Malicious uploads · AI Security for Apps · Bot score · Threat intelligence (yeni — Cloudforce One, 7 günlük kayan IP penceresi) · Application Profiles (yeni — pozitif güvenlik/şema, kapalı beta).
Nasıl çalışır?
Dört managed ruleset
| Ruleset | Tanım | ID |
|---|---|---|
| Cloudflare Managed Ruleset | “Created by the Cloudflare security team… covers known attack techniques and zero-day vulnerabilities… updated frequently” | efb7b8c949ac4650a09736fc376e9aee |
| Cloudflare OWASP Core Ruleset | “Cloudflare’s implementation of the OWASP ModSecurity Core Rule Set. This ruleset uses a scoring model” | 4814384a9e5d4991b9815dcfc25d2f1f |
| Cloudflare Exposed Credentials Check | kullanımdan kalktı — “Cloudflare recommends that you use leaked credentials detection instead” | c2e184081120413c86c3ab7e14069605 |
| Cloudflare Free Managed Ruleset | “Available on all Cloudflare plans. Provides protection against high-impact and widely exploited vulnerabilities.” | ID doğrulanamadı |
| Cloudflare Sensitive Data Detection | yanıt fazında çalışıyor | e22d83c647c64a3eae91b71b499d988e |
Uygunluk:
| Free | Pro | Business | Enterprise | |
|---|---|---|---|---|
| Free Managed Ruleset | ✅ | ✅ | ✅ | ✅ |
| Cloudflare Managed Ruleset | ✘ | ✅ | ✅ | ✅ |
| OWASP Core Ruleset | ✘ | ✅ | ✅ | ✅ |
| Sensitive Data Detection | ✘ | ✘ | ✘ | ✅ |
Ve bir not: “If you have already deployed the Cloudflare Managed Ruleset, you do not need this ruleset [Free] — the Cloudflare Managed Ruleset includes broader coverage.”
Faz sırası — tam ve resmî
Bu tablo, “kuralım neden çalışmıyor” sorusunun cevabının çoğunu içeriyor. İstek fazları, çalışma sırasıyla:
| Faz | Ürün |
|---|---|
http_request_dynamic_redirect | Single Redirects |
http_request_sanitize | URL normalization |
http_request_transform | URL Rewrite Rules |
| (iç faz) | Waiting Room Rules |
http_request_api_gateway_early* | API Shield |
http_config_settings | Configuration Rules |
http_request_origin | Origin Rules |
ddos_l7* | HTTP DDoS Attack Protection |
http_request_firewall_custom | Custom rules |
http_ratelimit | Rate limiting rules |
http_request_api_gateway_late | API Shield |
http_request_firewall_managed | WAF Managed Rules |
http_request_sbfm | Super Bot Fight Mode |
| (iç faz) | Cloudflare Access uygulama kontrolü |
http_request_redirect | Bulk Redirects |
| (iç faz) | Managed Transforms |
http_request_late_transform | Request Header Transform Rules |
http_request_cache_settings | Cache Rules |
http_request_snippets | Snippets |
http_request_cloud_connector | Cloud Connector |
* “This phase is for configuration purposes only — the corresponding rules will not be executed at this stage.”
Ve faz içi sıra: “Within each phase, account-level rulesets run before zone-level rulesets.”
Attack score
“The attack score traffic detection classifies each request using a machine learning algorithm, assigning a score from 1 to 99 based on the likelihood that the request is malicious.”
| Alan | Tanım | Plan |
|---|---|---|
cf.waf.score | “A global score from 1–99 that combines the score of each WAF attack vector” | Enterprise |
cf.waf.score.sqli | SQL injection vektörü | Enterprise |
cf.waf.score.xss | Cross-site scripting vektörü | Enterprise |
cf.waf.score.rce | Komut enjeksiyonu / uzaktan kod çalıştırma | Enterprise |
cf.waf.score.class | attack · likely_attack · likely_clean · clean | Business ve üzeri |
Sınıf aralıkları: attack 1–20 · likely_attack 21–50 · likely_clean 51–80 · clean 81–99.
Kod çözme: “Attack score automatically detects and decodes Base64, JavaScript (Unicode escape sequences), and URL encoded content anywhere in the request: URL, headers, and body.”
İki özel değer:
| Değer | Anlamı |
|---|---|
| 100 | “the request reached the WAF attack score system, but the system decided not to score it” — panelde Unscored, kural ifadesinde kullanılamıyor |
| 0 | “In Logpush data… the request did not reach the attack score stage” — panelde hiç görünmüyor |
Leaked credentials
Veri kaynağı üç parçalı: Have I Been Pwned eşleşen parola veri kümesi (yalnızca parolalar), Cloudflare’in topladığı kullanıcı adları, ve sızmış kimlik bilgisi çiftleri.
| Alan | Plan |
|---|---|
cf.waf.credential_check.password_leaked | tüm planlar |
cf.waf.credential_check.username_and_password_leaked | Pro ve üzeri |
cf.waf.credential_check.username_leaked | Enterprise |
cf.waf.credential_check.username_password_similar | Enterprise |
cf.waf.auth_detected | Enterprise |
“On Free plans, the leaked credentials detection is enabled by default, and no action is required.”
Varsayılan tarama konumları: Drupal, Joomla, Ghost, Magento, Plone, WordPress, Microsoft Exchange OWA, “plus generic rules for other common web authentication patterns.” Özel konum tanımlama yalnızca Enterprise ve en fazla 10 tane.
2026 eklemesi (changelog, 20 Ağustos 2026):
“Leaked credentials detection now scans the
Authorizationrequest header for Basic Authentication credentials. Previously, the detection only inspected request bodies, query strings, and headers for well-known web applications… This change was applied automatically.”
Origin’e bildirim: bir managed transform Exposed-Credential-Check başlığı ekliyor — değer 1
(kullanıcı adı ve parola çifti sızmış), 2 (kullanıcı adı sızmış), 4 (yalnızca parola sızmış).
Malicious uploads (content scanning)
Enterprise + ücretli eklenti. Antivirüs motoru Zero Trust’takiyle aynı.
“The malicious uploads detection uses heuristics to find content objects automatically, without relying on the request’s
Content-Typeheader (since this header can be manipulated).”
Taranmayan içerik tipleri: text/html, text/x-shellscript, application/json, text/csv,
text/xml.
Boyut: “The content scanner will fully check content objects with a size up to 50 MB. For larger content objects, the scanner will analyze the first 50 MB.”
Hiç taranmayanlar:
“Password-protected archives · Archives with more than three recursion levels · Archives with more than 300 files · PGP-encrypted files”
Ve: “In rare cases, the AV scanner may time out… the cf.waf.content_scan.has_failed field will be
set to true.” Ayrıca gecikme uyarısı: “Enabling malicious uploads detection can introduce
latency.”
OWASP Core Ruleset
“The Cloudflare OWASP Core Ruleset is Cloudflare’s implementation of the OWASP ModSecurity Core Rule Set version 3.3.0.”
Paranoia seviyeleri: PL1 (varsayılan) → PL4 (en katı). “When you configure the paranoia level… you are enabling all the rules belonging to all paranoia levels up to the level you select.” Ve: “If you use the highest paranoia level (PL4) you will probably need to disable some of its rules.”
Skor eşikleri: Low – 60 ve üzeri · Medium – 40 ve üzeri (varsayılan) · High – 25 ve üzeri.
Karşı sezgisel nokta: “Configuring a Low threshold means that more rules will have to match…” — yani “Low” daha gevşek, “High” daha sıkı.
Nasıl toplanıyor: “Each OWASP rule that matches the current request has an associated score. The request threat score is the sum of the individual scores of all OWASP rules that matched.”
Sampled loglarda görünen kural her zaman sonuncu: 949110: Inbound Anomaly Score Exceeded
(6179ae15870a4bb7b2d480d4843b323c). Katkıda bulunan tek tek kuralların skorlarını görmek için olay
detayında Additional logs’u aç.
Ayarlama stratejisi — iki alternatif, Cloudflare’in kendi ifadesiyle:
“Start from a strict configuration (PL4, threshold Low–60). Reduce the score threshold and paranoia level until you achieve a good false positives/true positives rate.”
“Alternatively, start from a more permissive configuration (PL1, threshold High–25) and increase both parameters.”
Exception ve override
“Exceptions have priority over overrides.”
Exception tipleri, en yüksek önceliklisinden:
- “Skip all remaining rules (belonging to WAF managed rulesets)”
- “Skip one or more WAF managed rulesets”
- “Skip one or more rules of WAF managed rulesets”
Override tuzağı:
“Ruleset overrides and tag overrides apply to both existing and future rules in the managed ruleset. If you want to override existing rules only, you must use rule overrides.”
Varsayılan duruş:
“Some rules in the Cloudflare Managed Ruleset are disabled by default, intending to strike a balance between providing the right protection and reducing the number of false positives.”
“It is not recommended that you enable all the available rules using overrides… unless you are running a proof of concept.”
“Cloudflare recommends that you enable the rules whose tags correspond to your technology stack. For example, if you use WordPress, enable the rules tagged with
wordpress.”
Somut bir örnek: “Cloudflare allows requests with empty user agents by default. To block requests
with an empty user agent, enable the rule with ID …0a6dbbd3.”
Limitler
| Öğe | Free | Pro | Business | Enterprise |
|---|---|---|---|---|
| Custom rule sayısı | 5 | 20 | 100 | 1.000 |
| Desteklenen aksiyonlar | Log hariç hepsi | Log hariç | Log hariç | hepsi |
| Regex desteği | ✘ | ✘ | ✅ | ✅ |
| Zone başına custom ruleset | 1 | 2 | 5 | 10 |
| Account seviyesi custom ruleset | ✘ | ✘ | ✘ | ✅ |
İfade limitleri: maksimum 4.096 karakter · ifade başına en fazla 64 regex. Ve: “Existing rules above this limit continue to work but cannot be modified until the expression is simplified.”
Listeler:
| Free | Pro | Business | Enterprise | |
|---|---|---|---|---|
| Custom list sayısı | 1 | 10 | 10 | 1.000 |
| Toplam liste öğesi | 10.000 | 10.000 | 10.000 | 500.000 |
| IP listeleri | ✅ | ✅ | ✅ | ✅ |
| Hostname ve ASN listeleri | ✘ | ✘ | ✘ | ✅ |
Liste adı ^[a-z0-9_]+$, en fazla 50 karakter. IP Access Rules: hesap başına 50.000, tüm
planlarda. “Block by country is only available on Enterprise plans.”
Body inceleme boyutu: Enterprise 128 KB · Free 1 MB · diğer ücretli planlar “lower by default”.
Analitik saklama:
| Free | Pro | Business | Enterprise | |
|---|---|---|---|---|
Security Events (firewallEventsAdaptive) | 24 saat | 24 saat | 3 gün | 30 gün |
Security Analytics (httpRequestsAdaptive) | 7 gün | 7 gün | 31 gün | 90 gün |
| Security Events sorgu penceresi | 24 saat | 24 saat | 3 gün | 31 gün |
Enterprise’da saklama 30 gün ama sorgu penceresi 31 gün — küçük ama gerçek bir asimetri.
Doğrulanamayanlar: Free Managed Ruleset’in tam 32 karakterlik ID’si (referans sayfası 404) ·
zone başına maksimum exception sayısı · managed ruleset’lerdeki toplam kural sayısı. Birleşik bir WAF
limitler sayfası yok (/waf/reference/limits/ 404).
Ne zaman kullanılır, ne zaman kullanılmaz
Kullanılır
- Proxy’li her HTTP uygulamasında. Free Managed Ruleset zaten açık ve ücretsiz; kapatmak için bir sebep yok.
- Bilinen zafiyetlere karşı hızlı kapama gerekiyorsa. Cloudflare Managed Ruleset haftalık, acil durumlarda daha sık güncelleniyor — 26 Ağustos 2026’daki Next.js CVE’si acil sürümle kapatıldı.
- Kimlik doldurma saldırısı alıyorsan. Leaked credentials tespiti ücretsiz planda bile açık.
- Yüklenen dosyaları taratman gerekiyorsa — ama Enterprise + eklenti.
Kullanılmaz — daha doğrusu, yetmez
Proxy’li olmayan trafikte. “Cloudflare only mitigates requests in proxied traffic.” Gri bulut kayıtlarda WAF sıfır.
Origin’in doğrudan erişilebilirse. “Is the malicious traffic reaching your origin IP addresses directly, therefore bypassing Cloudflare protection?” Origin’de Cloudflare IP’leri dışındaki her şeyi blokla.
HTTP olmayan protokollerde. WAF yalnızca HTTP istek ve yanıt fazlarında çalışıyor. TCP/UDP için Spectrum — ama o DDoS koruması veriyor, uygulama katmanı denetimi değil.
Boyut limitini aşan gövdelerde. 128 KB (Enterprise) veya 1 MB (Free) üstü tam analiz edilmiyor.
Uygulama içinde şifrelenmiş yükte. İstemci tarafında şifrelenmiş alanlar veya JSON içindeki şifreli bloklar imza ve skor motorlarına opak. Bu bir çıkarım — Cloudflare tek cümleyle böyle demiyor; content scanning’in PGP ve parola korumalı arşivleri dışlamasından ve TLS sonlandırma gerekliliğinden çıkıyor.
Uygulama mantığı hatalarında. Cloudflare’in kendi cümlesi: “This is an application logic bug that unfortunately cannot be covered through Cloudflare WAF signature engine.”
OWASP Top 10’un dört kategorisinde. Yukarıdaki kutu.
Daha erken bir faz isteği sonlandırdıysa. ddos_l7 veya http_request_firewall_custom fazında
bir Block varsa managed rules hiç çalışmıyor. Kendi yazdığın bir Skip kuralı da managed rules’u
tamamen kapatabiliyor — en yaygın kendi kendine açılan yanlış negatif.
Açmadığın kurallarda. “Not all rules of WAF managed rulesets are enabled by default.”
Free, Pro veya Business’ta “önce logla” yapmak istiyorsan. Log aksiyonu yalnızca Enterprise.
Somut örnekler
Managed ruleset’i deploy etmek ve ID’leri almak
curl -sS "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/phases/http_request_firewall_managed/entrypoint" \
-H "Authorization: Bearer $CF_API_TOKEN" \
| jq '{ruleset: .result.id,
kurallar: [.result.rules[] | {id, action, calistirilan: .action_parameters.id}]}'
action_parameters.id değeri efb7b8c949ac4650a09736fc376e9aee olan kuralın id’si, exception
yazarken ihtiyacın olan $EXECUTE_RULE_ID.
Attack score’a göre kural
RULESET=$(curl -sS ".../zones/$ZONE_ID/rulesets/phases/http_request_firewall_custom/entrypoint" \
-H "Authorization: Bearer $CF_API_TOKEN" | jq -r '.result.id')
# Enterprise
curl ".../zones/$ZONE_ID/rulesets/$RULESET/rules" --request POST \
-H "Authorization: Bearer $CF_API_TOKEN" \
--json '{"description":"Attack score dusuk olanlari blokla",
"expression":"(cf.waf.score le 20)","action":"block"}'
# Business
curl ".../zones/$ZONE_ID/rulesets/$RULESET/rules" --request POST \
-H "Authorization: Bearer $CF_API_TOKEN" \
--json '{"description":"Attack sinifini blokla",
"expression":"(cf.waf.score.class eq \"attack\")","action":"block"}'
Dar kapsamlı exception
curl ".../zones/$ZONE_ID/rulesets/$ENTRY_POINT_RULESET_ID/rules" --request POST \
-H "Authorization: Bearer $CF_API_TOKEN" \
--json '{
"expression": "(http.host eq \"ornek.com.tr\" and starts_with(http.request.uri.path, \"/admin\"))",
"description": "Yanlis pozitif: yonetici alaninda su kurali atla",
"action": "skip",
"action_parameters": {
"rules": { "efb7b8c949ac4650a09736fc376e9aee": ["<RULE_ID>"] }
},
"position": { "before": "'"$EXECUTE_RULE_ID"'" }
}'
position.before olmadan bu kural hiçbir şey atlamıyor.
Leaked credentials tespiti ve kuralı
# Tespiti aç
curl ".../zones/$ZONE_ID/leaked-credential-checks" --request POST \
-H "Authorization: Bearer $CF_API_TOKEN" --json '{"enabled": true}'
# Pro ve üzeri
curl ".../zones/$ZONE_ID/rulesets/$RULESET/rules" --request POST \
-H "Authorization: Bearer $CF_API_TOKEN" \
--json '{"description":"Sizmis kimlik bilgisi cifti",
"expression":"(cf.waf.credential_check.username_and_password_leaked)",
"action":"managed_challenge"}'
Security Events’i GraphQL ile okumak
curl -sS https://api.cloudflare.com/client/v4/graphql \
-H "Authorization: Bearer $CF_API_TOKEN" -H 'Content-Type: application/json' \
--data '{"query":"
query($zone:String!,$bas:Time!,$bit:Time!){viewer{zones(filter:{zoneTag:$zone}){
firewallEventsAdaptive(filter:{datetime_geq:$bas,datetime_leq:$bit},
limit:20, orderBy:[datetime_DESC]){
action source ruleId clientIP clientRequestPath clientCountryName userAgent datetime }
}}}",
"variables":{"zone":"'"$ZONE_ID"'",
"bas":"2026-09-01T00:00:00Z","bit":"2026-09-02T00:00:00Z"}}' | jq
Demo 1: Bir yanlış pozitifi uçtan uca çözmek
Bu, WAF’la çalışmanın gerçek işi — ve her ekibin er geç yapacağı şey.
Adım 1 — Başlangıç ve veri merkezini not et
curl -sS -D- -o /dev/null "https://ornek.com.tr/admin/kaydet" --data 'not=merhaba'
cf-ray yanıt başlığının sonundaki üç harf hangi veri merkezinin işlediğini söylüyor — Türkiye’de
IST veya ADB göreceksin.
Adım 2 — Gerçek bir saldırı gönder (doğru pozitif)
curl -sS -D- -o /dev/null "https://ornek.com.tr/ara?q=1%27%20OR%20%271%27%3D%271"
Adım 3 — Yanlış pozitifi üret
Meşru ama SQL benzeri metin içeren bir yönetici isteği — bir CMS’te “SQL injection” hakkında bir doküman sayfası kaydetmek, bu senaryonun klasik gerçek hayat örneği:
curl -sS -D- -o /dev/null "https://ornek.com.tr/admin/kaydet" \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data "baslik=SQL+rehberi&govde=Sorgularinizda asla ' OR '1'='1 yazmayin"
Adım 4 — Security Events’te kuralı bul
Suçlu 949110: Inbound Anomaly Score Exceeded ise (6179ae15870a4bb7b2d480d4843b323c), olay
detayında Additional logs’u aç — katkıda bulunan tek tek kuralların skorlarını orada görüyorsun.
Adım 5 — Dar kapsamlı exception yaz
Yukarıdaki POST çağrısını position.before ile çalıştır.
Adım 6 — İki tarafı da doğrula
Adım 3’ü tekrarla → 200 olmalı. Adım 2’yi tekrarla → hâlâ 403 olmalı.
Bir de sızma testi: aynı gövdeyi /admin dışında bir yola gönder — hâlâ engellenmeli.
curl -sS -o /dev/null -w '%{http_code}\n' "https://ornek.com.tr/kaydet" \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data "baslik=SQL+rehberi&govde=Sorgularinizda asla ' OR '1'='1 yazmayin"
Bu demoda ölçülenler:
| İstek | Önce | Exception sonrası | Ne kanıtlıyor |
|---|---|---|---|
GET /ara?q=1' OR '1'='1 | 403 | 403 | Saldırı hâlâ engelli — kapsam dar |
POST /admin/kaydet (meşru) | 403 | 200 | Yanlış pozitif çözüldü |
POST /kaydet (aynı gövde) | 403 | 403 | Exception /admin dışına taşmadı |
| Security Events, Block | ≥1 olay | 0 yeni olay | Olay logu doğruluyor |
| Security Events, Skip | 0 | ≥1 olay | Exception’ın kendisi loglanıyor |
Demo 2: Leaked credentials tespitini Cloudflare’in test kimlikleriyle tetiklemek
Bu demo tamamen deterministik — Cloudflare test için ayrılmış kimlik bilgileri yayımlıyor.
Adım 1 — Temiz kontrol isteği
curl -sS -D- -o /dev/null "https://ornek.com.tr/giris" \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data 'kullanici=ayse@ornek.com.tr&parola=Uzun-ve-benzersiz-parola-2026'
Adım 2 — Test kimlik bilgileriyle tetikle
Kimlik bilgileri büyük/küçük harfe duyarlı:
# Ücretsiz plan
curl -sS -D- -o /dev/null "https://ornek.com.tr/giris" \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data 'kullanici=CF_LEAKED_USERNAME_FREE&parola=CF_LEAKED_PASSWORD'
# Ücretli planlar
curl -sS -D- -o /dev/null "https://ornek.com.tr/giris" \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data 'kullanici=CF_EXPOSED_USERNAME&parola=CF_EXPOSED_PASSWORD'
# 2026 eklemesi — Basic auth da taranıyor
curl -sS -D- -o /dev/null -u 'CF_EXPOSED_USERNAME:CF_EXPOSED_PASSWORD' "https://ornek.com.tr/giris"
Adım 3 — Azaltma kuralını ekle
Yukarıdaki custom rule’u uygula, sonra Adım 2’yi tekrarla.
Adım 4 — Origin’e bildirimi aç
Managed transform ile Exposed-Credential-Check başlığını ekle ve on-prem origin’inde logla:
log_format kimlik '$remote_addr "$request" ecc=$http_exposed_credential_check';
access_log /var/log/nginx/kimlik.log kimlik;
Değerler: 1 çift sızmış · 2 kullanıcı adı sızmış · 4 yalnızca parola sızmış.
Adım 5 — Ücretsiz plan şablonunu göster
Ücretsiz planda hazır bir şablon var: “you get instant protection against IPs attempting to access your application with a leaked password more than five times per 10 seconds.”
Bu demoda ölçülenler:
| İstek | Tespit kapalı | Tespit açık, kural yok | Tespit + kural |
|---|---|---|---|
| Temiz kimlik | 200 | 200 | 200 |
CF_EXPOSED_* (form) | 200 | 200 | challenge |
CF_EXPOSED_* (Basic auth) | 200 | 200 | challenge |
| Security Analytics sinyali | 0 | ≥1 | ≥1 |
Origin’de Exposed-Credential-Check | yok | 1 (transform açıksa) | 1 |
Fiyatlandırma
| Özellik | Free | Pro | Business | Enterprise |
|---|---|---|---|---|
| WAF | ✅ | ✅ | ✅ | ✅ |
| Free Managed Ruleset | ✅ | ✅ | ✅ | ✅ |
| Cloudflare Managed Ruleset | ✘ | ✅ | ✅ | ✅ |
| OWASP Core Ruleset | ✘ | ✅ | ✅ | ✅ |
| Custom rule | 5 | 20 | 100 | 1.000 |
Log aksiyonu | ✘ | ✘ | ✘ | ✅ |
| Regex | ✘ | ✘ | ✅ | ✅ |
| Attack score (tam) | ✘ | ✘ | yalnızca class | ✅ |
| Leaked credentials (parola) | ✅ | ✅ | ✅ | ✅ |
| Leaked credentials (çift) | ✘ | ✅ | ✅ | ✅ |
| Malicious uploads | ✘ | ✘ | ✘ | ücretli eklenti |
| Sensitive Data Detection | ✘ | ✘ | ✘ | ✅ |
Lisanslama ve hukuki çerçeve
Hizmet tescillidir ve Cloudflare Hizmet Şartları’na tabidir.
TLS sonlandırma gerekliliği. WAF denetimi, trafiğin Cloudflare’de deşifre edilmesini gerektiriyor: “TLS termination — the point at which encrypted HTTPS traffic is decrypted so Cloudflare can inspect and apply your security rules.” Yani WAF kullanmak, Cloudflare’in trafiğinin içeriğini görmesi demek.
KVKK. Cloudflare hiçbir yerde KVKK, BTK, 5651 sayılı kanun veya BDDK’dan söz etmiyor —
cloudflare.com/sitemap.xml (896 URL), trust-hub, data-localization ve dokuz llms-full.txt
korpusunda sıfır eşleşme. Bu sayfadaki her KVKK yorumu kendi analizimizdir, Cloudflare beyanı
değildir.
Cloudflare’in kendi Türkçe terminolojisi (vaka çalışmalarından): “Web uygulaması güvenlik duvarı (WAF)” · “Hız Sınırlama” · “Gelişmiş Hız Sınırlama” · “DDoS Azaltma” · “Bot Yönetimi”. Bu portalda yerleşik İngilizce terimler korunuyor, ama Cloudflare ile yazışırken bu karşılıklar işine yarar.
Sık yapılan hatalar
Skip kuralını execute kuralının arkasına koymak. Hiçbir şey atlanmıyor.
Zone seviyesinde exception yazıp account seviyesindeki kuralı atlamayı beklemek. Kapsam ayrı.
Ruleset veya tag override’ın gelecekteki kuralları da etkilediğini bilmemek. Yalnızca mevcut kurallar için rule override kullan.
Tek bir yanlış pozitif için tüm ruleset’i kapatmak. “disable that specific rule and not the entire ruleset.”
Tüm managed rule’ları override ile açmak. “It is not recommended… unless you are running a proof of concept.”
Origin’i doğrudan erişime açık bırakmak. WAF yalnızca proxy’li trafiği görüyor.
Browser Integrity Check’i unutmak. Varsayılan açık, Ruleset Engine dışında, faz atlayarak
atlanamıyor — curl ve API istemcilerindeki 403’lerin sessiz kaynağı.
Attack score 0 gördüğünde “temiz” sanmak. İstek o aşamaya hiç ulaşmamış.
Attack score 100’ü kural ifadesinde kullanmaya çalışmak. Unscored sınıfı ifadelerde
kullanılamıyor.
50’nin altındaki tüm attack score’ları bloklamak. Cloudflare önermiyor; 21–50 aralığı meşru istek içerebiliyor.
OWASP’ı PL4 + Low ile açıp trafiği izlememek. Cloudflare bu kural setini “yanlış pozitife yatkın” diye tanımlıyor.
“Low threshold daha gevşek” sanmak. Tersi — Low (60) daha çok kural eşleşmesi istiyor, yani daha gevşek. High (25) daha sıkı.
4.096 karakter veya 64 regex sınırını aşmak. Kural kaydedilemiyor; mevcut kural çalışıyor ama düzenlenemiyor.
Body kesilmesini hesaba katmamak. Hem saldırı kaçırıyor hem yanlış pozitif üretiyor.
Kendi Skip kuralınla managed rules’u tamamen kapatmak. En yaygın kendi kendine açılan yanlış
negatif.
Sıkça sorulan sorular
- WAF kuralım hiç tetiklenmiyor, neden?
- Üç yaygın sebep. (1) DNS kaydın proxy'li değil — “Cloudflare only mitigates requests in proxied traffic.” (2) Daha erken bir faz isteği zaten sonlandırdı; sıra
ddos_l7→http_request_firewall_custom→http_ratelimit→http_request_firewall_managed→http_request_sbfm. (3) Kuralı deploy etmedin ya da bir exception onu atlıyor. - Custom rules ile Managed Rules arasındaki fark ne?
- Custom rules senin yazdıkların,
http_request_firewall_customfazında ve rate limiting'den önce çalışıyor. Managed Rules Cloudflare'in yazdığı imza tabanlı kurallar,http_request_firewall_managedfazında ve rate limiting'den sonra. Kritik sonuç: bir custom rule'daBlockvarsa, managed rules o istek için hiç çalışmıyor. - Ücretsiz planda WAF var mı?
- Var ama sınırlı: yalnızca Cloudflare Free Managed Ruleset (varsayılan açık) — “Provides protection against high-impact and widely exploited vulnerabilities.” Cloudflare Managed Ruleset ve OWASP Core Ruleset Pro ve üzeri. Custom rules ücretsizde 5 tane, regex yok, Log aksiyonu yok.
- <code>Log</code> aksiyonunu neden seçemiyorum?
- Birebir: “Only available on Enterprise plans.” Yani Free, Pro ve Business kullanıcıları bir kuralı Block'a almadan önce “önce logla, sonra karar ver” yapamıyor. Alternatif: Security Analytics'te aynı filtreyi uygulayıp kaç isteğin etkileneceğini önceden say.
- Attack score eşiğini kaça koymalıyım?
- Cloudflare'in tavsiyesi Enterprise için
cf.waf.score le 20ile başlamak. Ve açık bir uyarı var: “Blocking traffic solely based on attack score for all values below 50 is not recommended. The Likely attack range (scores 21–50) can include legitimate requests.” Business planda yalnızcacf.waf.score.class eq "attack"kullanabiliyorsun — tam skor Enterprise. - Attack score 0 veya 100 gördüm, ne demek?
- İkisi de özel değer. 100: “the request reached the WAF attack score system, but the system decided not to score it” — panelde Unscored görünüyor ama kural ifadesinde bu sınıfı kullanamıyorsun. 0: “In Logpush data, a score of 0 means the request did not reach the attack score stage” — panelde hiç görünmüyor. İkisi de “temiz” demek değil.
- OWASP Core Ruleset'i açmalı mıyım?
- Cloudflare kendisi çekinceli. Birebir: “The Cloudflare OWASP Core Ruleset is prone to false positives and offers only marginal benefits when added on top of Cloudflare Managed Ruleset and WAF attack score.” Açacaksan PL1 + Medium (40) ile başla ve trafiğini izle. Ayrıca bu, OWASP Top 10 değil — CRS 3.3.0 uygulaması.
- Bir managed rule meşru isteğimi blokluyor.
- Sırasıyla: (1) Security Events'te rule ID'yi bul; (2) mümkün olan en dar ifadeyle bir exception yaz — Cloudflare'in kendi örneği
http.host eq "ornek.com" and starts_with(http.request.uri.path, "/admin"); (3) son çare olarak override ile o tek kuralı kapat. Birebir: “If one specific rule causes false positives, disable that specific rule and not the entire ruleset.” - Exception yazdım ama hiçbir şey değişmedi.
- Sıralama. Birebir: “Rules with
skipaction only apply to rules withexecuteaction listed after them. If you add a rule withskipaction at the end of the rules list, nothing will be skipped.” API'deposition: {"before": "<EXECUTE_RULE_ID>"}kullan. - Exception ile override farkı ne?
- Exception kuralın çalışmasını atlıyor, override kuralın aksiyonunu değiştiriyor veya kapatıyor. Ve öncelik: “Exceptions have priority over overrides.” Bir tuzak daha: “Ruleset overrides and tag overrides apply to both existing and future rules… If you want to override existing rules only, you must use rule overrides.”
- curl ile 403 alıyorum ama Security Events'te kural göremiyorum.
- Büyük ihtimalle Browser Integrity Check. Varsayılan olarak açık ve Ruleset Engine'in dışında çalışıyor — faz atlayarak atlanamıyor. Birebir: “It also challenges visitors without a user agent or with a non-standard user agent.” Atlamak için custom rule'da
Skip→ products →bic. - Body'nin tamamı taranıyor mu?
- Hayır, plana bağlı: Enterprise 128 KB, Free 1 MB, diğer ücretli planlar “lower by default”. Ve çift yönlü bir sorun: kesilen body hem saldırı kaçırıyor hem yanlış pozitif üretiyor — “Larger payloads give more content for rules to match against, which increases the score.” Sinyal alanı:
http.request.body.truncated. - Yüklenen dosyaları taratabilir miyim?
- Enterprise + ücretli eklenti ile. Antivirüs motoru Zero Trust'takiyle aynı. 50 MB'a kadar tam tarama, üzeri kısmi. Taranmayanlar: parola korumalı arşivler, 3 seviyeden derin arşivler, 300'den fazla dosyalı arşivler, PGP şifreli dosyalar. Ve gecikme uyarısı var: “Enabling malicious uploads detection can introduce latency.”
- Sızmış parola tespiti parolalarımı Cloudflare'e mi gönderiyor?
- Hayır. Birebir: “Cloudflare does not store, log, or retain plaintext end-user passwords when performing leaked credential checks. Passwords are hashed, converted into a cryptographic representation, and then compared against a database of leaked credentials.” Veri kaynağı: Have I Been Pwned parola veri kümesi, Cloudflare'in topladığı kullanıcı adları ve sızmış çiftler.
- WAF uygulama hatalarımı kapatır mı?
- Hayır — ve Cloudflare bunu kendi changelog'unda yazıyor. İki 2026 Next.js CVE'si için birebir: “This is an application logic bug that unfortunately cannot be covered through Cloudflare WAF signature engine.” Ayrıca OWASP Top 10'un dört kategorisi için de aynı şeyi söylüyor: Cryptographic Failures, Insecure Design, Identification and Authentication Failures, Security Logging and Monitoring Failures.
İlgili servisler
- Rate LimitingIP, oturum veya özel anahtara göre request sayısını sınırlar.
- Bot ManagementHer request’e bot skoru verir; kazıyıcı, kimlik doldurma ve stok kapma trafiğini ayırır.
- DDoS ProtectionL3/L4 ağ katmanı DDoS savunması ve sınırsız (unmetered) koruma politikası. HTTP katmanı için DDoS for Web.
- API ShieldAPI uç noktalarını schema validation, mTLS ve anomali tespitiyle korur.
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.