Antipattern: RegularExpressionProtection politikasında greedy niteleyiciler kullanma

Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin.
bilgi

NormalExpressionProtection politikası, giriş parametreleri veya akış değişkenlerine göre çalışma zamanında değerlendirilen normal ifadeleri tanımlar. Bu politikayı genellikle SQL veya JavaScript yerleştirme gibi içerik tehditlerine karşı koruma sağlamak veya e-posta adresleri ya da URL'ler gibi hatalı biçimlendirilmiş istek parametrelerine karşı kontrol yapmak için kullanırsınız.

Normal ifadeler; istek yolları, sorgu parametreleri, form parametreleri, başlıklar, 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 yerleştirme saldırılarından 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 ?) açgözlüdür: Mümkün olan en uzun diziyle eşleşmeye başlarlar. Eşleşme bulunamadığında bu kalıba ulaşmayı denemek için yavaş yavaş geri giderler. Desenle eşleşen sonuç dizesi çok kısaysa açgözlü niceleyicilerin kullanılması gerekenden daha fazla zaman alabilir. Bu, özellikle yük büyükse (onlarca veya yüzlerce KB) büyükse geçerlidir.

Aşağıdaki örnek ifadede, açgözlü operatörler olan birden fazla .* örneği kullanılmaktadır:

<Pattern>.*Exception in thread.*</Pattern>

Bu örnekte, regularExpressionProtection politikası ilk olarak olası en uzun adımla, yani dizenin tamamıyla eşleşmeye çalışır. Eşleşme bulunmazsa politika, kademeli olarak geri gider. Eşleşen dize, yükün başına veya ortasına yakınsa .* gibi açgözlü bir miktar belirleyicinin kullanılması, .*? gibi isteksiz niteleyicilerden veya .*+ gibi sahipsiz niteleyicilerden çok daha fazla zaman ve işlem gücü gerektirebilir.

İsteksiz niceleyiciler (X*?, X+?, X?? gibi), yükün başından tek bir karakteri eşleştirmeye çalışarak başlar ve kademeli olarak karakter eklerler. Konum belirleyiciler (X?+, X*+, X++ gibi) yükün tamamını yalnızca bir kez eşleştirmeye çalışır.

Yukarıdaki kalıp için aşağıdaki örnek metin verilmiştir:

Hello this is a sample text with Exception in thread
with lot of text after the Exception text.

Bu durumda, gösterişsiz .* kullanmak performans göstermez. .*Exception in thread.* kalıbının eşleşmesi 141 adım sürer. Bunun yerine .*?Exception in thread.* kalıbını (istemsiz bir niceleyici kullanır) kullanırsanız sonuç yalnızca 55 adım olur.

Etki

regularExpressionProtection politikasıyla birlikte joker karakterler (*) gibi açlıklı niteleyiciler kullanılması şuna yol açabilir:

  • Orta düzeyde yük boyutunda (1 MB'a kadar) API istekleri için genel gecikmede artış
  • NormalExpressionProtection politikasını yürütmeyi tamamlamak için daha uzun süre
  • Uç Yönlendiricide önceden tanımlanmış zaman aşımı süresi geçerse 504 Ağ Geçidi Zaman Aşımı Hatalarıyla başarısız olan büyük yükleri (>1 MB) olan API istekleri
  • Diğer API isteklerini daha da etkileyebilecek çok miktarda işleme nedeniyle Mesaj İşleyenlerde yüksek CPU kullanımı

En iyi uygulama

  • regularExpressionProtection politikasıyla birlikte normal ifadelerde .* gibi açgözlü niteleyiciler kullanmaktan kaçının. Bunun yerine, mümkün olduğunda .*? gibi isteksiz belirleyiciler veya .*+ (daha seyrek) gibi sahip belirleyiciler kullanın.

Daha fazla bilgi