JSON / XML iç içe derinliğini sınırlayabilir miyim?
Kısa cevap
Evet. JSON ve Xml sekmelerinin ortak kuralındaki JSON Depth ve XML Depth alanları gövdedeki en derin değerin iç içe seviyesini kısıtlar. JSON'da değeri çevreleyen her nesne ve her dizi bir seviye sayılır: {"a":{"b":1}} için 2, {"a":[{"b":1}]} için 3. XML'de her eleman bir seviyedir; attribute'lar ve aynı adla yinelenen elemanlar birer seviye daha ekler. Aşım Structure Limits kategorisinde 24 puanlık ihlaldir ve Checks penceresindeki Structure Checks anahtarına bağlıdır. Any paths varsayılanı JSON için en çok 64, XML için en çok 128'dir. Path Depth ayrı bir alandır ve path'teki / sayısını sınırlar.
Sorun: Aşırı İç İçe Gövdelerle İstek Geliyor
Çok derin iç içe JSON ya da XML gövdeleri, uygulamanın çözümleyicisinde yığın taşması ya da yüksek işlemci tüketimi yaratmak için kullanılabilir. Uygulamanın gerçekte kullandığı derinlik biliniyorsa daha derin gövdeler reddedilmek isteniyor.
Çözüm: İki Yöntem
İki yöntem aynı alanı yazar; biri seçilir.
| Durumunuz | Uygun yöntem |
|---|---|
| Ayarı arayüzden yapmak istiyorum | Yöntem 1: Ortak kuralda depth alanı |
| Betik ya da komut satırıyla yapmak istiyorum | Yöntem 2: WEB-CLI |
Yöntem 1: Ortak Kuralda Depth Alanı Önerilen
- Nasıl çalışır Gövde çözümlendikten sonra en derin değerin seviyesi alandaki kısıtla karşılaştırılır.
- Nerede açılır Left Monitor Panel → WAF-Protected vServices → vService → WAF Management → N page types → kural → JSON / Xml → Add Common Rule for …
- GereksinimStructure Checks açık
- vService tipi WAF açık HTTP vService
- Ölçüm örnekleri
{"a":1}→ 1 ·{"a":{"b":1}}→ 2 ·{"a":[{"b":1}]}→ 3 ·<a><b>x</b></a>→ 2 ·<a x="1"/>→ 3
Adım adım yapılandırma
Structure Checks WAF açıldığında açık gelir; kapatıldıysa Left Monitor Panel → WAF-Protected vServices → vService → WAF Management sekmesinde Inspection & Blocking bölümündeki Checks kartının sağ üstündeki kalem ikonu tıklanır (Checks Edit ekranı).
Structure Checks açık konuma alınır. Anahtar kapalıyken depth alanları formda ve panelde gizlenir.
Edit tıklanır.
WAF Management sekmesinde host grubunun N page types satırına tıklanır (Page Types ekranına erişim).
Listede sayfa tipinin satırına tıklanır; kuralın detay paneli sağda açılır (panele erişim).
JSON ya da Xml sekmesine tıklanır.
Tablonun üstündeki Add Common Rule for JSON (ya da … for Xml) tıklanır; kural kendi ortak kuralına sahipse buton Edit Common Rule for … olarak görünür. Ekleme formu Any paths kuralının değerleriyle dolu açılır.
JSON Depth ya da XML Depth için işleç ve değer seçilir (ör. Less than or Equal to 6).
Add (düzenlemede Edit) tıklanır; değişiklik ayrı bir dağıtım adımı olmadan uygulanır. Cluster kurulumunda varsayılan auto-sync ile eş cihaza da gönderilir; Manual Sync Mode açıksa eş cihaza elle gönderilir.
Doğrulama
Kuralın JSON sekmesinde JSON depth satırına bakılır.
≤ 6Monitor ya da Blocking modunda sınırdan derin bir JSON gönderilip Event Logs kaydının Attacks sekmesine bakılır.
Attack name: JSON depth; Description: 7>6Yöntem 2: WEB-CLI
- Nasıl çalışır Sınır WEB-CLI ile
--jsonDepthya da--xmlDepthalanına yazılır. - Nerede açılır WEB-CLI →
waf rule-parts - Gereksinim WEB-CLI erişimi; Structure Checks açık (
waf options update poolId <vService> --syncWithDefaultFwRules false --structureChecks true) - vService tipi WAF açık HTTP vService
- Ön dolum farkı
addyazılmayan alanlara komutun varsayılanlarını yazar (jsonDepth≤ 8,xmlDepth≤ 32,…BlockAllaçık,valueLength0–1024)
Adım adım yapılandırma
Varsayılan host grubunun kimliği defaultHost'tur; kural kimlikleri id sütununda listelenir:
waf fw-rules list poolId <vService> hostGroupId defaultHostAçıklama sütununda json: (all keys) görünen satır JSON ortak parçasıdır:
waf rule-parts list poolId <vService> hostGroupId defaultHost ruleId <kural>waf rule-parts update poolId <vService> hostGroupId defaultHost ruleId <kural> id <parça> --jsonDepth.op "<=" --jsonDepth.val 6Bütün JSON gövdelerinin engellenmemesi için --jsonBlockAll false verilir:
waf rule-parts add poolId <vService> hostGroupId defaultHost ruleId <kural> loc json --jsonBlockAll false --jsonDepth.op "<=" --jsonDepth.val 6Doğrulama
Parça yeniden görüntülenir.
Komut: waf rule-parts show poolId <vService> hostGroupId defaultHost ruleId <kural> <parça>
jsonDepth.op ve jsonDepth.val satırlarında yeni değerSık Yapılan Hatalar
- Dizileri seviye saymamak. JSON'da her dizi de bir seviyedir; nesne dizisi taşıyan API'lerde sınır buna göre seçilir.
- XML'de attribute ve yinelenen eleman etkisini hesaba katmamak. Attribute değerleri ve aynı adla yinelenen elemanlar ölçümü birer seviye artırır (XML'de element ve attribute yolları nasıl tanımlanır?).
- İşlenebilir boyutu aşan gövdede derinlik ölçümü beklemek. Gövde işleme sınırını aşan gövdeler çözümlenmez; akıbetlerini Raw sekmesindeki Block Unparsed Contents belirler (Block Unparsed Contents ile Block Unexpected Parser Errors arasındaki fark nedir?).
- Path depth ile karıştırmak. Path Depth path'teki
/sayısını sınırlar ve sayfa tipinin kendi alanıdır (Path Length ve Path Depth kısıtları ne işe yarar?).
Dokümantasyonda nasıl yapılır
