İstek gövdesinde (JSON / XML / form) belirli içerikleri arayıp engelleyebilir miyim?
Kısa cevap
Evet. HTTP vService'te HTTP Request Body koşulu gövdenin ilk Body Size to Parse(Bytes) baytında (varsayılan 1024, en fazla 16384) metin ya da Regex arar; koşul Block aksiyonuna bağlanır. Arama ham bayt üzerindedir: JSON ve XML ayrıştırılmaz, form değerleri URL kodlu hâliyle aranır. WAF etkinse Signature & Rule Library'de Inspection Scopes alanında Form, JSON, XML ya da Raw seçili bir özel kural ayrıştırılmış gövdede arama yapar; sayfa tiplerindeki Value Pattern ve Allowed JSON Keys gibi izinli anahtar alanları ise beklenen biçim dışındaki değerleri ihlal sayar.
Sorun: İstek Gövdesinde İstenmeyen İçerik Geliyor
API'lere ya da formlara yetki yükseltme alanları, yasaklı anahtar kelimeler ya da bilinen saldırı desenleri içeren gövdeler gönderilebilir. Bu içerikleri taşıyan isteklerin Kurum Servisine ulaşmadan durdurulması istenir.
Çözüm: Dört Yöntem
Yöntem 1 WAF olmadan çalışır; Yöntem 2 ve 3 WAF ile çalışır ve birlikte kullanılabilir; Yöntem 4, Yöntem 1'in komut satırı karşılığıdır. SQL enjeksiyonu ve XSS gibi bilinen saldırılar için kural yazılmaz: WAF açık ve Blocking modundaysa hazır imzalar gövdeyi zaten tarar (WAF nedir).
| Durumunuz | Uygun yöntem |
|---|---|
| WAF olmadan, gövdenin ilk 16 KB'ında metin ya da desen arama | Yöntem 1: HTTP Request Body + Block |
| WAF var; ayrıştırılmış form, JSON ya da XML değerlerinde desen arama | Yöntem 2: WAF özel kural (Signature & Rule Library) |
| WAF var; beklenen değer biçimi ya da izinli alan adları dışını reddetme | Yöntem 3: WAF value pattern ve izinli anahtarlar |
| Yöntem 1'i komut satırından kurmak | Yöntem 4: WEB-CLI |
Yöntem 1: HTTP Request Body + Block Önerilen
- Nasıl çalışır Koşul, gövdenin ilk Body Size to Parse(Bytes) baytında deseni ham metin olarak arar. Gövde koşulu kullanılan vService'te istekler bu kadar tamponlanır; birden çok gövde koşulu varsa en büyük değer bütün isteklere uygulanır.
- Nerede açılırLoad Balancer → Conditions → HTTP Request Body · Load Balancer → Actions → Block
- Gereksinim Yok
- vService tipi HTTP
Adım adım yapılandırma
Load Balancer → Conditions → Add ile koşul formu açılır (nasıl eklenir).
Condition Name = govde-rol, Criteria = HTTP Request Body seçilir; eşleştirme listesinde Regex (düz metin için Includes) seçilir. Query alanına desen (ör. "role"\s*:\s*"admin") yazılır, gerekiyorsa Case Insensitive işaretlenir ve Body Size to Parse(Bytes) = 4096 girilir. Bu koşulda Is present seçeneği yoktur. Örnek desen {"role":"admin"} ve {"role" : "admin"} gövdelerini yakalar, {"role":"user"} gövdesini yakalamaz.
Koşul Add ile kaydedilir.
Load Balancer → Actions → Add ile aksiyon formu açılır.
Action Name = govde-engelle, Action Type = Block seçilir; Execution Level varsayılan On request, Deny Type varsayılan Standard ve Status Code varsayılan 403 bırakılır.
Conditions alanında govde-rol seçilir. Arama yalnızca bir API yoluna uygulanacaksa aynı grupta bir Path koşulu and ile eklenir; böylece diğer isteklerin gövdesi taranmaz.
Aksiyon Add ile kaydedilir.
Load Balancer → Load Balancer vService List ekranında HTTP vService seçilip Edit ile düzenleme formu açılır.
Details → Actions alanında govde-engelle seçilir. Aksiyon vService'e eklenmedikçe çalışmaz.
Form Save ile kaydedilir. Cluster'da değişiklik varsayılan olarak eş cihaza otomatik aktarılır; Manual Sync Mode açıksa Synchronize ile gönderilir.
Doğrulama
Komut: curl -s -o /dev/null -w '%{http_code}' -X POST -H 'Content-Type: application/json' -d '{"role":"admin"}' https://www.example.com/api
403Aynı komut -d '{"role":"user"}' ile çalıştırılır.
Uygulamanın normal yanıtı (ör. 200)Yöntem 2: WAF → Özel Kural (Signature & Rule Library)
- Nasıl çalışır Özel kural, seçilen kapsamlarda (ayrıştırılmış form alanları, JSON ve XML değerleri ya da ham gövde) deseni arar ve eşleşmede isteğin risk puanına Score kadar katkı yapar; toplam puan vService'teki koruma düzeyinin eşiğine ulaşınca istek engellenir.
- Nerede açılır Configuration Menu → WAF → Signature & Rule Library → Add (bütün vService'ler) · vService'in OWASP Rules ekranı (yalnızca o vService)
- Gereksinim WAF lisansı; WAF etkin HTTP vService; WAF alanında tam yetki (kütüphaneye yazmak için)
- vService tipi HTTP
Adım adım yapılandırma
vService'te WAF açık değilse HTTP vService düzenlenir, Details altındaki WAF kutusu işaretlenip Save ile kaydedilir; ayrıntı: WAF, L7 DDoS & Threat Protection ve AGS'yi bir vService'e nasıl bağlarım?
Configuration Menu → WAF → Signature & Rule Library ekranında Add ile kural ekleme formu açılır.
Name girilir; State varsayılan Enabled, Score varsayılan Medium bırakılır ya da değiştirilir. Inspection Scopes alanında varsayılan Path kaldırılıp Form, JSON, XML ya da Raw seçilir ve Pattern (Regex) girilir. Desen PCRE'nin bir alt kümesiyle yazılır; geri referans ve lookahead/lookbehind desteklenmez, uzunluk en fazla 4096 karakterdir.
Form Accept ile kaydedilir; ayrı bir dağıtım adımı yoktur.
Left Monitor Panel → WAF-Protected vServices → vService → WAF Management sekmesinde mod kartının Edit butonuyla WAF Mode = Blocking Mode seçilip kaydedilir. WAF Learning modunda başlar; Learning ve Monitor modlarında istek engellenmez, yalnızca kaydedilir.
Doğrulama
Desenli gövde gönderilir; WAF-Protected vServices → vService → Event Logs ekranına bakılır.
Özel kural tetiklenir; eşik aşıldıysa Attack blockedYöntem 3: WAF → Value Pattern ve İzinli Anahtarlar
- Nasıl çalışır Sayfa tipindeki alan denetimleri "şuna uymuyorsa ihlal" mantığıyla çalışır: değer Value Pattern desenine uymazsa ya da anahtar izinli listede yoksa istek ihlal sayılır.
- Nerede açılır Left Monitor Panel → WAF-Protected vServices → vService → WAF Management → Page Types → kural → JSON / XML / Form sekmesi
- Gereksinim WAF lisansı; WAF etkin HTTP vService
- vService tipi HTTP
Adım adım yapılandırma
vService'te WAF açık değilse Yöntem 2'nin 1. adımı uygulanır.
WAF Management sekmesinde Page Types listesinden ilgili yolun kuralı açılır; gövde türüne göre JSON, XML ya da Form sekmesi seçilir.
Ortak kural ya da tek bir alana özel kural formunda JSON Value Pattern, XML Value Pattern ya da Form Value Pattern ile beklenen değer biçimi; Allowed JSON Keys, Allowed XML Keys ya da Allowed Form Fields ile izinli anahtar listesi tanımlanır. Bu yolda gövde türü hiç beklenmiyorsa Block All JSON Contents gibi seçenekler kullanılır.
Form Add ile kaydedilir.
Yöntem 2'nin 5. adımı uygulanır.
Doğrulama
Desene uymayan bir değer gönderilir; WAF Event Logs ekranına bakılır.
Value pattern ihlali, Attack blockedYöntem 4: WEB-CLI
- Nasıl çalışır Yöntem 1'deki HTTP Request Body koşulu ve Block aksiyonu
lb condition/lb actionile oluşturulur, aksiyonlb serviceile vService'e eklenir. - Nerede açılır TR7 WEB-CLI →
lb condition·lb action·lb service - Gereksinim WEB-CLI erişimi
- vService tipi HTTP
Adım adım yapılandırma
WEB-CLI her satırı ayrı bir komut olarak çalıştırır; komutlar tek satırda yazılır. Desen tek tırnak içinde yazılır; | karakteri tırnak içinde bile komutu böldüğü için | içeren desenler arayüzden (Yöntem 1) girilir.
req_body = HTTP Request Body; --bodySize = Body Size to Parse(Bytes) (içerik eşleştiren ölçütler).
lb condition add criteria req_body query '"role"\s*:\s*"admin"' --content_placement regex --caseInsensitive true --bodySize 4096 --name govde-rolAksiyonun --cond alanı koşulun adını değil kimliğini ister. lb condition add başarılı olduğunda çıktı vermez; kimlik aşağıdaki listenin id sütununda görülür (lbConditions- ile başlar).
lb condition listStatus code belirtilmezse 403'tür (engelleme aksiyonları).
lb action add type deny name govde-engelle --cond <govde-rol-kimliği>rules.0, rules.1… satırları vService'e bağlı aksiyonları gösterir.
lb service show <vService>Yeni aksiyon ilk boş indekse, yani mevcut aksiyon sayısına yazılır. Örnekte vService'te iki aksiyon (rules.0, rules.1) olduğu için --rules.2 kullanılır; dolu bir indekse yazmak oradaki aksiyonun yerine geçer.
lb service update id <vService> --rules.2 govde-engelleDoğrulama
Yöntem 1'deki curl denemesi tekrarlanır.
403Sık Yapılan Hatalar
- GET isteklerinde gövde aramak. Gövdesiz isteklerde HTTP Request Body koşulu eşleşmez.
- Desenin Body size to parse sınırından sonra yer alması. Koşul yalnızca ilk N baytı görür; en fazla 16384 bayt taranır.
- JSON boşluk farklarını hesaba katmamak.
"role":"admin"ile"role" : "admin"farklı metinlerdir; Regex'te\s*kullanılır. - URL kodlu form ya da sıkıştırılmış gövdede düz metin aramak. Koşul ham baytı görür; form değerleri kodlu hâliyle aranır.
--condalanına koşul adını yazmak. WEB-CLI'da--condkoşul kimliği bekler; ad yazılırsa aksiyon var olmayan bir koşula bağlanır.
Dokümantasyonda nasıl yapılır
