Antywzór: użyj kwantyfikatorów zachłannych w zasadzie RegularExpressionProtection

Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
info

Zasada RegularExpressionProtection określa wyrażenia regularne, które są oceniane w czasie działania na podstawie parametrów wejściowych lub zmiennych przepływu. Zazwyczaj używasz tej zasady do ochrony przed zagrożeniami związanymi z treścią, takimi jak wstrzykiwanie kodu SQL lub JavaScript, lub do sprawdzania nieprawidłowo sformułowanych parametrów żądania, takich jak adresy e-mail lub adresy URL.

Wyrażenia regularne można zdefiniować dla ścieżek żądań, parametrów zapytania, parametrów formularza, nagłówków, elementów XML (w ładunku XML zdefiniowanym za pomocą XPath) i atrybutów obiektów JSON (w ładunku JSON zdefiniowanym za pomocą JSONPath).

Poniższy przykład zasady RegularExpressionProtection chroni backend przed atakami typu SQL injection:

<!-- /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>

Antywzorzec

Domyślne kwantyfikatory (*, + i ?) są zachłanne: zaczynają dopasowywać się do najdłuższej możliwej sekwencji. Jeśli nie zostanie znalezione żadne dopasowanie, stopniowo wycofują się, aby spróbować dopasować wzorzec. Jeśli wynikowy ciąg znaków pasujący do wzorca jest bardzo krótki, użycie zachłannych kwantyfikatorów może zająć więcej czasu niż to konieczne. Jest to szczególnie prawdziwe, jeśli ładunek jest duży (dziesiątki lub setki kilobajtów).

W tym przykładzie wyrażenia używane są wielokrotnie zachłanne operatory .*:

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

W tym przykładzie zasada RegularExpressionProtection najpierw próbuje dopasować najdłuższą możliwą sekwencję – cały ciąg znaków. Jeśli nie zostanie znalezione żadne dopasowanie, zasada stopniowo wycofuje się. Jeśli pasujący ciąg znaków znajduje się blisko początku lub środka ładunku, użycie a zachłannego kwantyfikatora, takiego jak .*, może zająć znacznie więcej czasu i mocy obliczeniowej niż niechętne kwantyfikatory, takie jak .*?, lub (rzadziej) kwantyfikatory dzierżawcze, takie jak .*+.

Niechętne kwantyfikatory (np. X*?, X+?, X??) zaczynają od dopasowania pojedynczego znaku od początku ładunku i stopniowo dodają znaki. Kwantyfikatory dzierżawcze (np. X?+, X*+, X++) próbują dopasować cały ładunek tylko raz.

Oto przykładowy tekst dla powyższego wzorca:

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

Użycie zachłannego kwantyfikatora .* jest w tym przypadku nieefektywne. Dopasowanie wzorca .*Exception in thread.* wymaga 141 kroków. Jeśli zamiast tego użyjesz wzorca .*?Exception in thread.* (który używa niechętnego kwantyfikatora), wynik będzie wymagał tylko 55 kroków.

Wpływ

Używanie zachłannych kwantyfikatorów, takich jak symbole wieloznaczne (*), z zasadą RegularExpressionProtection może prowadzić do:

  • zwiększenia ogólnego czasu oczekiwania na żądania interfejsu API w przypadku ładunku o umiarkowanym rozmiarze (do 1 MB),
  • dłuższego czasu wykonywania zasady RegularExpressionProtection,
  • niepowodzenia żądań interfejsu API z dużymi ładunkami (> 1 MB) z powodu błędów 504 Gateway Timeout, jeśli na routerze Edge upłynie predefiniowany czas oczekiwania,
  • wysokiego wykorzystania procesora na procesorach wiadomości z powodu dużej ilości przetwarzania, co może mieć dalszy wpływ na inne żądania interfejsu API.

Sprawdzona metoda

  • Unikaj używania zachłannych kwantyfikatorów, takich jak .*, w wyrażeniach regularnych z zasadą RegularExpressionProtection. Zamiast tego w miarę możliwości używaj niechętnych kwantyfikatorów, takich jak .*? lub (rzadziej) kwantyfikatorów dzierżawczych, takich jak .*+ wszędzie tam, gdzie jest to możliwe.

Więcej informacji