Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin. bilgi
RegularExpressionProtection politikası, giriş parametrelerinde veya akış değişkenlerinde çalışma zamanında değerlendirilen normal ifadeleri tanımlar. Bu politikayı genellikle SQL veya JavaScript ekleme gibi içerik tehditlerine karşı koruma sağlamak ya da e-posta adresleri veya URL'ler gibi hatalı biçimlendirilmiş istek parametrelerini kontrol etmek için kullanırsınız.
Normal ifadeler; istek yolları, sorgu parametreleri, form parametreleri, üstbilgiler, XML öğeleri (XPath kullanılarak tanımlanan bir XML yükünde), JSON nesne özellikleri (JSONPath kullanılarak tanımlanan bir JSON yükünde) için tanımlanabilir.
Aşağıdaki örnek RegularExpressionProtection politikası, arka ucu SQL ekleme saldırılarına karşı korur:
<!-- /antipatterns/examples/greedy-1.xml --> <RegularExpressionProtection async="false" continueOnError="false" enabled="true" name="RegexProtection"> <DisplayName>RegexProtection</DisplayName> <Properties/> <Source>request</Source> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <QueryParam name="query"> <Pattern>[\s]*(?i)((delete)|(exec)|(drop\s*table)| (insert)|(shutdown)|(update)|(\bor\b))</Pattern> </QueryParam> </RegularExpressionProtection>
Antipattern
Varsayılan niceleyiciler (*, + ve ?) doğası gereği açgözlüdür: Mümkün olan en uzun sırayla eşleşmeye başlarlar. Eşleşme bulunamadığında, deseni eşleştirmek için yavaş yavaş geri giderler. Desene uyan sonuç dizesi çok kısaysa açgözlü niceleyicilerin kullanılması gerekenden daha fazla zaman alabilir. Bu durum, özellikle yük büyükse (onlarca veya yüzlerce KB) geçerlidir.
Aşağıdaki örnek ifadede, açgözlü operatörler olan .* operatörünün birden fazla örneği kullanılmaktadır:
<Pattern>.*Exception in thread.*</Pattern>
Bu örnekte, RegularExpressionProtection politikası ilk olarak mümkün olan en uzun diziyi (dizenin tamamı) eşleştirmeye çalışır. Eşleşme bulunamazsa politika yavaş yavaş geri gider. Eşleşen dize, yükün başlangıcına veya ortasına yakınsa .* gibi açgözlü bir niceleyici kullanmak, .*? gibi isteksiz niceleyicilere ya da (daha az yaygın olarak) .*+ gibi sahiplenici niceleyicilere kıyasla çok daha fazla zaman ve işlem gücü gerektirebilir.
İsteksiz niceleyiciler (ör. X*?, X+?, X??), yükün başından tek bir karakterle eşleşmeye çalışarak başlar ve yavaş yavaş karakter ekler.
İyelik belirten nicelikler (ör. X?+, X*+, X++) yalnızca bir kez yükün tamamıyla eşleşmeye çalışır.
Yukarıdaki kalıp için aşağıdaki örnek metin verildiğinde:
Hello this is a sample text with Exception in thread with lot of text after the Exception text.
Bu durumda açgözlü .* kullanmak performanslı değildir. Kalıbın
.*Exception in thread.* eşleşmesi 141 adım sürüyor. Bunun yerine .*?Exception in thread.* kalıbını (isteksiz niceleyici kullanır) kullandıysanız sonuç yalnızca 55 adım olurdu.
Etki
RegularExpressionProtection politikası ile joker karakterler (*) gibi greedy niteleyicilerin kullanılması aşağıdakilere yol açabilir:
- Orta düzeyde bir yük boyutu (1 MB'a kadar) için API isteklerinde genel gecikmede artış
- RegularExpressionProtection politikasının yürütülmesinin tamamlanması daha uzun sürer.
- Önceden tanımlanmış zaman aşımı süresi Edge yönlendiricide dolarsa büyük yükler (>1 MB) içeren API istekleri 504 Ağ Geçidi Zaman Aşımı hatalarıyla başarısız oluyor
- İşleme miktarının yüksek olması nedeniyle mesaj işleyicilerde yüksek CPU kullanımı. Bu durum, diğer API isteklerini de etkileyebilir.
En iyi uygulama
- RegularExpressionProtection politikası ile normal ifadelerde
.*gibi greedy niteleyiciler kullanmaktan kaçının. Bunun yerine, mümkün olduğunda.*?gibi isteksiz nicelik belirten ifadeleri veya.*+gibi iyelik nicelik belirten ifadeleri (daha az yaygın olarak) kullanın.