JSON'da yalnızca belirli anahtarların gelmesine izin verebilir miyim; iç içe anahtar yolları nasıl yazılır?
Kısa cevap
Evet. JSON sekmesinin ortak kuralındaki Allowed JSON Keys pozitif bir listedir; anahtarlar noktalı tam yol olarak yazılır (user.name), büyük/küçük harfe duyarlıdır ve dizi indisleri yolu uzatmaz: user.roles dizisinin her elemanı user.roles yoluyla eşleşir. Liste kapsayıcı yolları da içermelidir; {"user":{"name":"john","roles":["admin"]}} gövdesi için user, user.name ve user.roles yollarının üçü de listede bulunur. Listede olmayan her farklı yol Structure Policies kategorisinde 24 puanlık ihlaldir. Aynı yol yazımı değişken kuralının Argument Name alanında da kullanılır. JSON'da zorunlu anahtar listesi yoktur. Denetim için Checks penceresinde Argument Checks açık olmalı ve liste Max. Allowed Arguments değerini aşmamalıdır.
Sorun: JSON API Beklenmeyen Anahtarlarla Çağrılıyor
Bir JSON uç noktasına şemada olmayan anahtarlar gönderiliyor (toplu atama ya da gizli alan denemeleri, ör. "isAdmin": true). Gövdede yalnızca beklenen anahtar yollarına izin verilmek ve tek tek yolların değerleri kısıtlanmak isteniyor.
Anahtar Yolları Nasıl Yazılır?
Yol, nesne anahtarlarının . ile birleştirilmesiyle oluşur; dizi indisleri yola eklenmez.
| Gövde | Listede bulunması gereken yollar |
|---|---|
{"user":{"name":"john","roles":["admin"]}} | user, user.name, user.roles |
{"items":[{"id":1,"qty":2}]} | items, items.id, items.qty |
[{"id":1}] (kök dizi) | id |
{"a":{"b":{"c":"x"}}} | a, a.b, a.b.c |
Yollar büyük/küçük harfe duyarlıdır; User.Name ile user.name farklı yollardır. Değişken kuralının Argument Name alanına da aynı tam yol yazılır; yalnızca son parça (name) iç içe anahtarı yakalamaz.
Çözüm: Üç Yöntem
Yöntem 1 ve 2 farklı işler yapar ve birlikte kullanılabilir; Yöntem 3 komut satırı karşılığıdır.
| Durumunuz | Uygun yöntem |
|---|---|
| Gövdede yalnızca belirli yollara izin vereceğim | Yöntem 1: Allowed JSON Keys |
| Belirli bir yolun değerini kısıtlayacağım | Yöntem 2: JSON değişken kuralı |
| Betik ya da komut satırıyla yapmak istiyorum | Yöntem 3: WEB-CLI |
Yöntem 1: Allowed JSON Keys Önerilen
- Nasıl çalışır Gövdedeki her farklı yol (kapsayıcılar dahil) listeyle karşılaştırılır; listede olmayan her yol ihlal sayılır.
- Nerede açılır Left Monitor Panel → WAF-Protected vServices → vService → WAF Management → N page types → kural → JSON → Add Common Rule for JSON
- GereksinimArgument Checks açık; liste Max. Allowed Arguments değerinden uzun değil
- vService tipi WAF açık HTTP vService
Adım adım yapılandırma
Argument 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ı).
Argument Checks açık konuma alınır; listenin yol sayısı Max. Allowed Arguments değerinden (varsayılan 25) büyükse değer artırılır.
Edit tıklanır.
WAF Management sekmesinde host grubunun N page types satırına tıklanır (Page Types ekranına erişim).
JSON uç noktasının sayfa tipine tıklanır; detay paneli sağda açılır (panele erişim). Sayfa tipi yoksa önce eklenir (Yeni bir page type'ı elle nasıl eklerim?).
Panelin sekme şeridinde JSON sekmesine tıklanır.
Add Common Rule for JSON tıklanır; kural kendi JSON ortak kuralına sahipse buton Edit Common Rule for JSON olarak görünür (Add Common Rule for JSON ekranı). Ekleme formu Any paths kuralının JSON değerleriyle dolu açılır.
Allowed JSON Keys anahtarı Restrict konumuna alınır ve kapsayıcılar dahil her yol listeye ayrı bir öğe olarak eklenir (ör. user, user.name, user.roles).
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
Host grubu Blocking modundayken listede olmayan bir anahtarla JSON gönderilir.
Komut: curl -s -o /dev/null -w "%{http_code}\n" -H "Content-Type: application/json" -d '{"user":{"name":"john","isAdmin":true}}' https://www.example.com/api/profil
418Event Logs kaydının Attacks sekmesine bakılır.
Attack area: JSON@user.isAdmin · Attack name: Allowed JSON keysYöntem 2: JSON Değişken Kuralı
- Nasıl çalışır Tek bir yolun metin değerleri için uzunluk, desen ve OWASP check ayarı tanımlanır; o yol için JSON ortak kuralının değer denetimleri uygulanmaz.
- Nerede açılır Left Monitor Panel → WAF-Protected vServices → vService → WAF Management → N page types → kural → JSON → Add Argument Rule for JSON
- Gereksinim Değer denetimleri için Structure Checks açık
- vService tipi WAF açık HTTP vService
Adım adım yapılandırma
Yöntem 1'deki 4–6. adımlarla sayfa tipinin JSON sekmesi açılır.
Değişken tablosunun üstündeki Add Argument Rule for JSON tıklanır (Add Argument Rule for JSON ekranı).
Argument Name kutusuna tam yol yazılır (ör. user.name); JSON Value Length ve JSON Value Pattern alanları doldurulur (ör. desen ^[a-z]+$). Desen ve uzunluk yalnızca metin değerlere uygulanır; sayı ve mantıksal değerler denetlenmez.
Add tıklanır.
Doğrulama
Kuralın JSON sekmesindeki değişken tablosuna bakılır.
user.name satırı kalın; detayında JSON value pattern ^[a-z]+$Yöntem 3: WEB-CLI
- Nasıl çalışır Yöntem 1'deki liste ve Yöntem 2'deki değişken kuralı WEB-CLI ile yazılır.
- Nerede açılır WEB-CLI →
waf rule-parts - Gereksinim WEB-CLI erişimi; Argument Checks açık; değer denetimleri için Structure Checks açık
- vService tipi WAF açık HTTP vService
- Ön dolum farkı
addyazılmayan alanlara komutun varsayılanlarını yazar (jsonBlockAllaçık,jsonDepth≤ 8,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>Bü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 --jsonAllowedArgs.0 user --jsonAllowedArgs.1 user.name --jsonAllowedArgs.2 user.rolesÖnce waf rule-parts show … <parça> ile mevcut jsonAllowedArgs.N satırları görülür; --jsonAllowedArgs.N o sıradaki mevcut yolun yerine geçtiği için yeni yol ilk boş sıraya yazılır (liste boşsa 0):
waf rule-parts update poolId <vService> hostGroupId defaultHost ruleId <kural> id <parça> --jsonAllowedArgs.0 userDesen tek tırnak içinde yazılır:
waf rule-parts add poolId <vService> hostGroupId defaultHost ruleId <kural> loc json --arg user.name --argRegex.input '^[a-z]+$'Doğrulama
Kuralın parçaları listelenir.
Komut: waf rule-parts list poolId <vService> hostGroupId defaultHost ruleId <kural>
json: (all keys) ve json: user.nameSık Yapılan Hatalar
- Kapsayıcı yolu yazmamak.
userkapsayıcısı da denetlenir; listede yoksausernesnesi taşıyan her istek ihlal üretir. - Dizi indisi yazmak. Dizi indisleri yola eklenmez;
user.roles.0hiçbir değerle eşleşmez, dizinin elemanlarıuser.rolesyoluyla denetlenir. - Max. allowed arguments'ı aşmak. Derin şemalarda yol sayısı hızla artar; liste Max. Allowed Arguments değerini aşarsa o kural için uygulanmaz, değer artırılır (Max. Allowed Arguments ne işe yarar; bir sayfanın öğrenilmiş argüman listesi bu sayıyı aşarsa ne olur?).
- Zorunlu anahtar listesi aramak. JSON'da yalnızca izinli yol listesi vardır; bir anahtarın varlığı zorunlu kılınamaz.
- WEB-CLI'da
addilejsonBlockAll'u açık bırakmak.addkomutundajsonBlockAllvarsayılanı açıktır; ortak parça eklenirken--jsonBlockAll falseverilmezse bütün JSON gövdeleri engellenir.
Dokümantasyonda nasıl yapılır
