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

Przeglądasz dokumentację Apigee Edge.
Przejdź do Dokumentacja Apigee X.
informacje.

Zasada RegularExpressionProtection definiuje wyrażenia regularne oceniane w w czasie działania na parametrach wejściowych lub zmiennych przepływu. Zazwyczaj ta zasada jest używana do ochrony przed zagrożenia związane z treścią, np. wstrzykiwanie kodu SQL lub JavaScript, albo sprawdzanie pod kątem nieprawidłowych parametrów żądania; takich jak adresy e-mail czy adresy URL.

Wyrażenia regularne można definiować dla ścieżek żądań, parametrów zapytania, parametrów formularza, nagłówki, elementy XML (w ładunku XML zdefiniowanym za pomocą XPath), atrybuty obiektów JSON (w formacie JSON ładunek zdefiniowanego za pomocą JSONPath).

Poniższa przykładowa zasada RegularExpressionProtection chroni backend przed SQL ataki polegające na wstrzykiwaniu:

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

Antywzór

Domyślne kwantyfikatory (*, + i ?) są chciwe w charakter: zaczynają pasować do najdłuższej możliwej sekwencji. Jeśli nie zostaną znalezione pasujące wyniki, stopniowo je zmniejszać, starając się dopasować do wzorca. Jeśli uzyskany ciąg znaków pasujący do wzorca to bardzo krótkie, więc użycie chaosowych kwantyfikatorów może zająć więcej czasu, niż jest to konieczne. Jest to szczególnie ważne, true (prawda), jeśli ładunek jest duży (kilkadziesiąt lub setki KB).

To przykładowe wyrażenie korzysta z wielu wystąpień zmiennej .*, które są atrakcyjnością operatory:

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

W tym przykładzie zasada RegularExpressionProtection próbuje dopasować najpierw najdłuższą możliwą wartość sekwencji – całego ciągu. Jeśli nie zostanie znalezione dopasowanie, zasada stosuje działanie wsteczne. stopniowo. Jeśli pasujący ciąg znajduje się blisko początku lub w środku ładunku, użyj funkcji kwantyfikator zachłanny, taki jak .*, może zająć o wiele więcej czasu i mocy obliczeniowej niż kwalifikatory takie jak .*? lub (rzadziej) kwalifikatory dzierżawcze, takie jak .*+

Wskaźniki oporne (np. X*?, X+?, X??) zaczynają się od , aby dopasować pojedynczy znak od początku ładunku i stopniowo dodawać znaki. Kwantyfikatory dziwaczne (takie jak X?+, X*+, X++) próbują dopasować cały ładunek.

Biorąc pod uwagę następujący tekst przykładowy dla powyższego wzorca:

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

W tym przypadku użycie zachłannego parametru .* nie jest skuteczne. Wzór .*Exception in thread.* musi wykonać 141 kroków. Jeśli użyto wzoru .*?Exception in thread.* (który wykorzystuje kwantyfikator niechętny), by uzyskać wynik będzie to tylko 55 kroków.

Wpływ

Stosując kwantyfikatory zachłanne, takie jak symbole wieloznaczne (*), z parametrem Zasada RegularExpressionProtection może spowodować:

  • zwiększenie ogólnego czasu oczekiwania w przypadku żądań do interfejsu API o umiarkowanym rozmiarze ładunku (do 1 MB).
  • Dłuższe zakończenie wykonywania zasady RegularExpressionProtection
  • Żądania do interfejsu API z dużymi ładunkami (>1 MB) kończą się niepowodzeniem i wyświetlany jest błąd 504 związany z czasem oczekiwania bramy, jeśli w routerze brzegowym upłynie wstępnie określony czas oczekiwania
  • Wysokie wykorzystanie procesora przez procesory wiadomości ze względu na dużą ilość przetwarzania, które może dodatkowo wpływają na inne żądania do interfejsu API

Sprawdzona metoda

  • Unikaj stosowania w wyrażeniach regularnych z parametrem zachłaniania kwantyfikatorów, takich jak .*, Zasada RegularExpressionProtection. Zamiast tego używaj kwantyfikatorów, np. .*? lub kwantyfikatory dzierżawialne, takie jak .*+ (rzadziej), gdy: jak to tylko możliwe.

Więcej informacji