Антишаблон: используйте жадные квантификаторы в политике RegularExpressionProtection.

Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee
X.info

Политика RegularExpressionProtection определяет регулярные выражения, которые оцениваются во время выполнения для входных параметров или переменных потока. Обычно эта политика используется для защиты от угроз, связанных с содержимым, таких как SQL-инъекции или JavaScript-внедрения, или для проверки некорректных параметров запроса, таких как адреса электронной почты или URL-адреса.

Регулярные выражения могут быть определены для путей запроса, параметров запроса, параметров формы, заголовков, элементов XML (в полезной нагрузке XML, определенной с помощью XPath), атрибутов объекта JSON (в полезной нагрузке JSON, определенной с помощью JSONPath).

Приведенный ниже пример политики RegularExpressionProtection защищает бэкэнд от SQL-инъекций:

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

Антипаттерн

Квантификаторы по умолчанию ( * , + и ? ) имеют жадный характер: они начинают поиск с максимально длинной последовательности. Если совпадение не найдено, они постепенно возвращаются назад, пытаясь найти нужный шаблон. Если результирующая строка, соответствующая шаблону, очень короткая, использование жадных квантификаторов может занять больше времени, чем необходимо. Это особенно актуально, если объем полезной нагрузки велик (десятки или сотни килобайт).

В приведенном ниже примере выражения используется несколько экземпляров оператора .* , которые являются жадными операторами:

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

В этом примере политика RegularExpressionProtection сначала пытается найти совпадение с максимально длинной последовательностью — всей строкой. Если совпадение не найдено, политика постепенно возвращается назад. Если совпадающая строка находится близко к началу или середине полезной нагрузки, то использование жадного квантификатора, такого как .* может занять гораздо больше времени и вычислительной мощности, чем использование менее требовательных квантификаторов, таких как .*? или (реже) притяжательных квантификаторов, таких как .*+ .

Квантификаторы с нежеланием (например X*? X+? ?, X?? ) начинают с попытки сопоставить один символ из начала полезной нагрузки и постепенно добавляют символы. Квантификаторы с притяжательным залогом (например X?+ , X*+ , X++ ) пытаются сопоставить всю полезную нагрузку только один раз.

Рассмотрим следующий пример текста для указанного выше шаблона:

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

Использование жадного оператора .* в данном случае неэффективно. Для сопоставления шаблона .*Exception in thread.* требуется 141 шаг. Если бы вместо него использовался шаблон .*?Exception in thread.* (который использует нежелательный квантификатор), результат составил бы всего 55 шагов.

Влияние

Использование "жадных" квантификаторов, таких как подстановочные знаки ( * ), с политикой RegularExpressionProtection может привести к следующим последствиям:

  • Увеличение общей задержки для запросов API при умеренном размере полезной нагрузки (до 1 МБ).
  • Увеличение времени выполнения политики RegularExpressionProtection
  • API-запросы с большими объемами данных (>1 МБ) завершаются с ошибкой 504 Gateway Timeout, если истекает заданный период ожидания на пограничном маршрутизаторе.
  • Высокая загрузка ЦП процессорами сообщений из-за большого объема обработки, что может дополнительно повлиять на другие запросы API.

Передовая практика

  • Избегайте использования чрезмерно агрессивных квантификаторов, таких как .* в регулярных выражениях с политикой RegularExpressionProtection . Вместо этого, по возможности, используйте менее агрессивные квантификаторы, такие как .*? или притяжательные квантификаторы, такие как .*+ (реже).

Дополнительная информация