XML'de element ve attribute yolları nasıl tanımlanır?
Kısa cevap
XML gövdesi ağaç olarak çözümlenir; eleman yolları iç içe seviyeler için . ile birleşir (user.address.city), attribute'lar elemanın altındaki _attr düğümüyle yazılır: <user type="admin"> için user._attr.type (XML nedir). Bu yazım hem Xml sekmesindeki Allowed XML Keys listesinde hem değişken kuralının Argument Name alanında kullanılır; birebir ve büyük/küçük harfe duyarlıdır. Allowed XML Keys listesi kapsayıcı yolları da içermelidir: ara elemanlar (user, user.address) ve attribute taşıyan elemanlarda hem user._attr hem user._attr.type. Aynı adla yinelenen kardeş elemanlar tek yol altında toplanır. XML yorumları ve işleme talimatları denetime girmez; XML için zorunlu anahtar listesi yoktur.
Sorun: XML Servisinde Yollar XPath Gibi Yazılamıyor
Bir XML ya da SOAP uç noktasında yalnızca beklenen eleman ve attribute'lara izin verilmek ya da belirli bir attribute'un değeri kısıtlanmak isteniyor. TR7 yolları XPath söz dizimiyle değil, noktalı yol yazımıyla tanımlanır.
Yol Yazımı
| XML | Listede bulunması gereken yollar |
|---|---|
<user><name>john</name></user> | user, user.name |
<user type="admin"><name>john</name></user> | user, user._attr, user._attr.type, user.name |
<user><address><city>X</city></address></user> | user, user.address, user.address.city |
<user><roles><item>a</item><item>b</item></roles></user> | user, user.roles, user.roles.item (her item bu yolla denetlenir) |
<a x="1">metin</a> | a, a._attr, a._attr.x (metin değeri a yoluyla denetlenir) |
Kök eleman yolun ilk parçasıdır. Eleman adları istekteki yazımıyla (ön ekli adlarda ns:user gibi) karşılaştırılır. Değer denetimleri (uzunluk, desen, OWASP check) eleman metinlerine ve attribute değerlerine uygulanır.
Çö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 eleman ve attribute'lara izin vereceğim | Yöntem 1: Allowed XML Keys |
| Belirli bir eleman ya da attribute'un değerini kısıtlayacağım | Yöntem 2: Xml değişken kuralı |
| Betik ya da komut satırıyla yapmak istiyorum | Yöntem 3: WEB-CLI |
Yöntem 1: Allowed XML Keys Önerilen
- Nasıl çalışır Gövdedeki her farklı yol (kapsayıcılar ve
_attrdüğümleri dahil) listeyle karşılaştırılır; listede olmayan her yol Structure Policies kategorisinde 24 puanlık ihlaldir. - Nerede açılır Left Monitor Panel → WAF-Protected vServices → vService → WAF Management → N page types → kural → Xml → Add Common Rule for Xml
- 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; 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).
XML uç noktasının sayfa tipine tıklanır; detay paneli sağda açılır (panele erişim).
Panelin sekme şeridinde Xml sekmesine tıklanır.
Add Common Rule for Xml tıklanır; kural kendi Xml ortak kuralına sahipse buton Edit Common Rule for Xml olarak görünür (Add Common Rule for XML ekranı). Ekleme formu Any paths kuralının Xml değerleriyle dolu açılır.
Allowed XML Keys anahtarı Restrict konumuna alınır ve kapsayıcılar dahil her yol listeye ayrı bir öğe olarak eklenir (ör. user, user._attr, user._attr.type, user.name).
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 attribute ile XML gönderilir.
Komut: curl -s -o /dev/null -w "%{http_code}\n" -H "Content-Type: application/xml" -d '<user type="admin" role="root"><name>john</name></user>' https://www.example.com/soap
418Xml@user._attr.role olarak görünür.Yöntem 2: Xml Değişken Kuralı
- Nasıl çalışır Tek bir eleman ya da attribute yolunun değeri için uzunluk, desen ve OWASP check ayarı tanımlanır; o yol için Xml 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 → Xml → Add Argument Rule for Xml
- 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 Xml sekmesi açılır.
Değişken tablosunun üstündeki Add Argument Rule for Xml tıklanır (Add Argument Rule for XML ekranı).
Argument Name kutusuna tam yol yazılır (ör. user._attr.type); XML Value Length ve XML Value Pattern alanları doldurulur (ör. desen ^(admin|user)$).
Add tıklanır.
Doğrulama
Kuralın Xml sekmesindeki değişken tablosuna bakılır.
user._attr.type satırı kalın; detayında XML value patternYö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
- Desen kısıtı
|içeren desen (ör.^(admin|user)$) WEB-CLI satırında komutu böler; böyle desenler arayüzden girilir
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 xml: (all keys) görünen satır Xml ortak parçasıdır:
waf rule-parts list poolId <vService> hostGroupId defaultHost ruleId <kural>add komutunda xmlBlockAll varsayılanı açık olduğundan --xmlBlockAll false verilir; yazılmayan alanlar komutun varsayılanlarıyla gelir (ör. valueLength 0–1024):
waf rule-parts add poolId <vService> hostGroupId defaultHost ruleId <kural> loc xml --xmlBlockAll false --xmlAllowedArgs.0 user --xmlAllowedArgs.1 user._attr --xmlAllowedArgs.2 user._attr.type --xmlAllowedArgs.3 user.nameÖnce waf rule-parts show … <parça> ile mevcut xmlAllowedArgs.N satırları görülür; --xmlAllowedArgs.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> --xmlAllowedArgs.0 userDesen tek tırnak içinde ve | kullanmadan yazılır:
waf rule-parts add poolId <vService> hostGroupId defaultHost ruleId <kural> loc xml --arg user._attr.type --argRegex.input '^[a-z]{3,10}$'Doğrulama
Kuralın parçaları listelenir.
Komut: waf rule-parts list poolId <vService> hostGroupId defaultHost ruleId <kural>
xml: (all keys) ve xml: user._attr.typeSık Yapılan Hatalar
- Attribute için
user.typeyazmak. Attribute yolu_attrile yazılır:user._attr.type. user._attrkapsayıcısını unutmak. Allowed XML Keys listesinde kapsayıcı_attryolu da bulunur; eksikse attribute taşıyan her istek ihlal üretir.- XPath söz dizimi (
/user/@type) kullanmak. Yalnızca noktalı yol yazımı geçerlidir. - Yinelenen eleman için indis yazmak.
user.roles.item.0gibi indisli yol yoktur; yinelenen elemanların hepsiuser.roles.itemyoluyla denetlenir. - WEB-CLI'da
addilexmlBlockAll'u açık bırakmak.addkomutundaxmlBlockAllvarsayılanı açıktır; ortak parça eklenirken--xmlBlockAll falseverilmezse bütün XML gövdeleri engellenir.
Dokümantasyonda nasıl yapılır
