Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X. Информация
Правило 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, если на маршрутизаторе Edge истекает заданный период ожидания.
- Высокая загрузка процессора на обработчиках сообщений из-за большого объема обработки, что может повлиять на другие запросы к API.
Совет
- Не используйте жадные кванторы, например
.*, в регулярных выражениях с правилом RegularExpressionProtection. Вместо этого по возможности используйте неохотные квантификаторы, например.*?, или притяжательные квантификаторы, например.*+(реже).