API'mden gelen JSON istekleri "Block Invalid JSON Contents" kuralıyla engelleniyor; neden?
Kısa cevap
Block Invalid JSON Contents, Content-Type başlığı JSON bildiren (…/json ya da …+json) bir istek gövdesi JSON olarak çözümlenemediğinde tetiklenir. 24 puanlık bir yapısal ihlaldir; her koruma düzeyinde tek başına engelleme eşiğine ulaşır. Gövde geçerli JSON değilse (sondaki virgül, yorum satırı, tek tırnak, satır satır JSON), Content-Encoding ile sıkıştırılmış gönderiliyorsa (WAF gövdeyi açmaz) ya da Content-Type yanlışlıkla JSON bildiriyorsa tetiklenir. Kural Any Paths'te varsayılan olarak kapalıdır; Analysis & Learning'in JSON gövdesi gördüğü sayfa tiplerinde, Aggressive düzeyde Sync with Default WAF Rules ile yeniden kurulan Any paths'te ve WEB-CLI ile eklenen JSON parçalarında açık gelir. Kaydın Request & Location sekmesindeki başlıklar ve gövde incelenir; istemci düzeltilir ya da kutu isteğin eşleştiği sayfa tipinin JSON ortak kuralında kaldırılır. Kutu kapalıyken çözümlenemeyen gövde engellenmez, ham içerik olarak imza taramasından geçer. Sık karışan Block All JSON Contents ise geçerli ya da geçersiz her JSON gövdesini engeller.
Sorun: API'nin JSON İstekleri Engelleniyor
API istemcisinin gönderdiği istekler engelleme yanıtı (varsayılan durum kodu 418) alıyor; Event Logs kaydının Attacks sekmesinde Attack Name = Block Invalid JSON Contents, Attack area = JSON görünüyor. Gövdenin geçersiz olup olmadığı, isteğin JSON olarak işlenip işlenmeyeceği Content-Type başlığına göre belirlenir.
Olası Nedenler
| Neden | Nasıl ayırt edilir |
|---|---|
Gövde RFC 8259'a uygun JSON değil: sondaki virgül ({"a":1,}), yorum satırı, tek tırnaklı ya da tırnaksız anahtar, birden çok kök değer (satır satır JSON) | Request & Location → Body (gövde Max. Body Size to Log(kB) sınırının altındaysa kayıtlıdır; varsayılan 2 kB) |
Gövde Content-Encoding ile sıkıştırılmış gönderiliyor; WAF istek gövdesini açmaz ve sıkıştırılmış bayt dizisi JSON olarak çözümlenemez | HTTP Headers → content-encoding (ör. gzip) |
Content-Type JSON bildiriyor ama gövde başka biçimde (form verisi, düz metin) | HTTP Headers → content-type; Body |
| Kutu bu uçta açık: isteğin eşleştiği kural Analysis & Learning'in oluşturduğu bir sayfa tipi, Aggressive düzeyde Sync with Default WAF Rules ile kurulmuş Any Paths ya da WEB-CLI ile eklenmiş bir JSON parçası | Attacks → Corresponding Rule; kuralın JSON sekmesinde Block Invalid JSON Contents satırı |
Kesin kurallar:
- JSON olarak işlenen istekler,
Content-Typedeğeri büyük/küçük harf ayrımı olmadan…/json(ör.application/json,application/json; charset=utf-8,text/json) ya da…+json(ör.application/vnd.api+json,application/problem+json) biçimine uyan isteklerdir. Diğer türler JSON denetimlerine girmez. - Gövde denetim tamponuna sığmadıysa JSON çözümlemesi hiç yapılmaz; kayıt Block Invalid JSON Contents değil Block Unparsed Contents olur (Büyük POST istekleri engelleniyor veya yarıda kesiliyor; neden?).
- Kural Monitor Mode ve Blocking Mode'da değerlendirilir, Blocking mode'da engeller; Learning Mode'da puanlanmaz. Checks kartındaki Structure Checks kapalıysa uygulanmaz (varsayılan açık).
- Kutu kapalıyken çözümlenemeyen gövde engellenmez; Raw sekmesinin OWASP Check ayarıyla ham içerik olarak imza taramasından geçer. Kutu açıkken 24 puan engelleme eşiğine ulaştığından denetim bu noktada sona erer.
- Arayüzde Add Common Rule for JSON ile açılan form Any paths'in JSON değerleriyle dolu gelir; Any paths'te kutu kapalıysa yeni ortak kuralda da kapalıdır. WEB-CLI'daki
waf rule-parts add … loc jsonkomutu ise Block all JSON contents ve Block invalid JSON contents alanlarını belirtilmediğinde açık yazar (loc json alanları). - Block All JSON Contents (Structure Policies kategorisi) JSON gövdeyi çözümlemeden engeller. Bu kayıt görülüyorsa kural JSON gövde kabul etmeyecek şekilde kurulmuştur. Ignore Old Rules = Create New Rules ile uygulanan analiz Any paths'te bu kutuyu açar; öğrenme döneminde JSON gövdesi görülen sayfa tiplerinde (Page independent politikada Any paths'in kendisinde) kutu kapalı kalır (Yeni sürüm yayınladıktan sonra yeni sayfalar engelleniyor; ne yapmalıyım?).
Nereden İzlenir?
| Ekran | Yol | Ne gösterir |
|---|---|---|
| Event Logs | Left Monitor Panel → WAF-Protected vServices → vService → Event Logs | Attacks sekmesinde Attack name, Corresponding rule, Learning suggestion (Block invalid JSON contents will be disabled); Request & Location sekmesinde HTTP headers, Body, Matching path rules |
| Page Types → JSON sekmesi | WAF Management → host grubunun mod kartı → N page types → kural | Kutunun durumu; değer devralınıyorsa Rule source |
Çözüm: Dört Yöntem
Gövde gerçekten bozuksa düzeltme istemcide yapılır. Uç geçersiz ya da sıkıştırılmış gövdeyi bilerek kabul ediyorsa kutu yalnızca o sayfa tipinde kaldırılır.
| Durumunuz | Uygun yöntem |
|---|---|
İstemci geçersiz JSON, yanlış Content-Type ya da sıkıştırılmış gövde gönderiyor | Yöntem 1: İstemciyi düzeltmek |
| Bu uçta kural gereksiz; kural ekranından kaldırılacak | Yöntem 2: Sayfa tipinde kutuyu kaldırmak |
| Bu uçta kural gereksiz; kayıttan kaldırılacak | Yöntem 3: Event Logs'tan Allow |
| Ayar komut satırından yapılacak | Yöntem 4: WEB-CLI |
| Kayıt Block All JSON Contents | Bir sayfada JSON veya XML gövdesini tamamen yasaklayabilir miyim (Block All JSON Contents / Block All XML Contents)? |
Yöntem 1: İstemciyi Düzeltmek Önerilen
- Nasıl çalışır Kayıttaki başlıklar ve gövde incelenir; istemci geçerli ve sıkıştırılmamış JSON gönderecek,
Content-Type'ı gövdeyle uyumlu bildirecek şekilde düzeltilir. WAF ayarı değişmez, denetim korunur. - Nerede açılır Left Monitor Panel → WAF-Protected vServices → vService → Event Logs → kayıt → Request & Location
- Gereksinim WAF görme yetkisi; istemci uygulamasında değişiklik
- vService tipi HTTP
Adım adım yapılandırma
Left Monitor Panel'de WAF-Protected vServices kategorisi seçilir, vService'e tıklanır ve Event Logs sekmesi açılır.
Sunucu filtresi sekmesinde Request Unique ID alanına istemcinin aldığı yanıttaki Request ID yazılır ya da Date Range olay zamanını kapsayacak şekilde seçilir.
Save & Get Logs tıklanır.
Satıra tıklanır ve önizlemede Request & Location sekmesi seçilir. HTTP Headers ve Body alanları başlıklarındaki göz ikonuyla açılır; content-type, content-encoding ve gövdenin biçimi okunur.
İstemci tarafında gövde geçerli JSON olarak üretilir, istek gövdesi sıkıştırılmadan gönderilir ve Content-Type gövdenin gerçek biçimini bildirir (ör. form verisi için application/x-www-form-urlencoded). WAF tarafında yapılacak bir değişiklik yoktur.
Doğrulama
Düzeltilmiş istek gönderilir.
Komut: curl -s -o /dev/null -w "%{http_code}" -H "Content-Type: application/json" -d '{"a":1}' https://api.example.com/v1/orders
Kurum Servisinin yanıt kodu (418 değil)Yöntem 2: Sayfa Tipinde Kutuyu Kaldırmak
- Nasıl çalışır İsteğin eşleştiği sayfa tipinin JSON ortak kuralında Block Invalid JSON Contents işareti kaldırılır; diğer sayfa tipleri ve Any paths değişmez.
- Nerede açılır Left Monitor Panel → WAF-Protected vServices → vService → WAF Management → N page types → kural → JSON sekmesi
- Gereksinim WAF değiştirme yetkisi
- vService tipi HTTP
Adım adım yapılandırma
Left Monitor Panel'de WAF-Protected vServices seçilir, vService'e tıklanır ve WAF Management sekmesi açılır. İsteğin düştüğü host grubunun mod kartındaki N page types bağlantısı tıklanır (ekrana erişim).
Kayıttaki Corresponding Rule'da yazan kuralın satırına tıklanır; detay paneli açılır.
Panelin sekme şeridinde JSON tıklanır. Rule source satırı görünüyorsa değer başka bir kuraldan devralınmaktadır; değişiklik o kuralda ya da bu kurala kendi ortak kuralı eklenerek yapılır (devralma).
Edit Common Rule for JSON (kuralın kendi JSON ortak kuralı varsa) ya da Add Common Rule for JSON tıklanır (Add common rule for JSON ekranı).
Block Invalid JSON Contents işareti kaldırılır. Uç JSON gövde kabul ediyorsa Block All JSON Contents'in de işaretsiz olduğu kontrol edilir.
Formdaki Edit (ya da yeni ortak kuralda Add) tıklanır; değişiklik ayrı bir dağıtım adımı olmadan uygulanır. Cluster kurulumunda değişiklik varsayılan auto-sync ile eş cihaza da gönderilir; Manual Sync Mode açıksa Synchronize ile gönderilir.
Doğrulama
Kuralın JSON sekmesindeki Block Invalid JSON Contents satırına bakılır.
-✓, kapalı alanlar - ile gösterilir.Yöntem 3: Event Logs'tan Allow
- Nasıl çalışır Kayıttaki Block Invalid JSON Contents saldırısı öğretilir; Learning Suggestion satırı
Block invalid JSON contents will be disabledyazar ve öğretme, eşleşen kuralda kutuyu kaldırır. Sonuç Yöntem 2 ile aynıdır. - Nerede açılır Left Monitor Panel → WAF-Protected vServices → vService → Event Logs → kayıt → Attacks
- Gereksinim WAF değiştirme yetkisi; kaydın Event Logs'ta bulunması (host grubu Monitor ya da Blocking mode'da)
- vService tipi HTTP
Adım adım yapılandırma
Event Logs'ta kayıt Yöntem 1'in 1–3. adımlarıyla getirilir, satıra tıklanır ve önizlemede Attacks sekmesi seçilir.
Saldırı tablosunda Block Invalid JSON Contents satırının kutusu işaretlenir.
Tablonun üstündeki buton tıklanır. Buton engellenmiş bir kayıtta Allow, Monitor mode'da yazılmış bir kayıtta Teach adını taşır (Allow / Teach).
Are you sure? sorusunda Yes tıklanır; değişiklik ayrı bir dağıtım adımı olmadan uygulanır. Cluster kurulumunda değişiklik varsayılan auto-sync ile eş cihaza da gönderilir; Manual Sync Mode açıksa Synchronize ile gönderilir. Ayrıntı: Allow / Teach yaptığımda arka planda hangi kural değişir (Learning Suggestion)?
Doğrulama
Event Logs'ta öğretilen kaydın Attacks kolonuna bakılır.
İlk sayı 0; satır yeşilYöntem 4: WEB-CLI
- Nasıl çalışır Kuralın JSON ortak parçasında
jsonBlockInvalidalanı WEB-CLIwaf rule-parts updatekomutuylafalseyapılır. - Nerede açılır WEB-CLI →
waf fw-rules·waf rule-parts - Gereksinim WEB-CLI erişimi ve WAF değiştirme yetkisi; kuralın kendi JSON ortak parçasının bulunması
- vService tipi HTTP
Adım adım yapılandırma
waf fw-rules list poolId <vService> hostGroupId <grup>Varsayılan host grubunun kimliği defaultHost, Any paths kuralının kimliği wr-default'tur.
waf rule-parts list poolId <vService> hostGroupId <grup> ruleId <kural>Bölgesi json olan ve argüman adı taşımayan parça JSON ortak parçasıdır. Listede yoksa kural JSON ayarlarını devralmaktadır; değişiklik devralınan kuralda yapılır.
waf rule-parts update poolId <vService> hostGroupId <grup> ruleId <kural> id <parça> --jsonBlockInvalid falseDoğrulama
Parça yeniden görüntülenir.
Komut: waf rule-parts show poolId <vService> hostGroupId <grup> ruleId <kural> <parça>
jsonBlockInvalid falseSık Yapılan Hatalar
- İki kuralı karıştırmak. Block Invalid JSON Contents yalnızca çözümlenemeyen gövdeyi, Block All JSON Contents geçerli ya da geçersiz her JSON gövdeyi engeller.
- Kutuyu Any paths'te aramak. Any paths'te varsayılan olarak kapalıdır; değişiklik kayıttaki Corresponding Rule'da yazan kurala yapılır.
- Sıkıştırılmış istek gövdesini gözden kaçırmak. WAF istek gövdesini açmaz;
Content-Encodingtaşıyan JSON isteği çözümlenemez. - WEB-CLI ile JSON parçası eklerken alanları belirtmemek.
waf rule-parts add … loc jsonBlock All JSON Contents ve Block Invalid JSON Contents alanlarını açık yazar; JSON kabul eden uçta--jsonBlockAll falseyazılır. - Tampon kaynaklı kaydı bu kuralla karıştırmak. Gövde tampona sığmadıysa kayıt Block Unparsed Contents'tir (Büyük POST istekleri engelleniyor veya yarıda kesiliyor; neden?).
Dokümantasyonda nasıl yapılır
İlgili sorular
- Bozuk (parse edilemeyen) JSON / XML / form gövdelerini engelleyebilir miyim?
- Bir sayfada JSON veya XML gövdesini tamamen yasaklayabilir miyim (Block All JSON Contents / Block All XML Contents)?
- Raw sekmesi ne inceler; parse edilemeyen içerik ne olur?
- JSON gövdeli API isteklerinde şema benzeri kontrol (anahtar listesi, derinlik, uzunluk) yapabilir miyim?
