Назад | Перейти на главную страницу

Что такое ограничения PCRE?

В ModSecurity есть PCRE limits exceeded ошибки.

Я знаю, что могу исправить это, установив такие правила, как:

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000

Но что на самом деле делают эти правила? Что означает предельная рекурсия PCRE, равная 150 000? Какие дыры в безопасности я позволяю себе, устанавливая их так высоко? Что это recursion и limit значит?

Я знаю, что есть документация, но на самом деле она не говорит мне, что происходит, она просто говорит мне, как работать с директивами.

Похоже, что это внутренние настройки механизма PCRE, чтобы ограничить максимальный объем памяти / времени, затрачиваемого на попытки сопоставить некоторый текст с шаблоном. В pcreapi справочная страница мало что может объяснить с точки зрения непрофессионала:

Поле match_limit обеспечивает средства предотвращения использования PCRE огромного количества ресурсов при выполнении шаблонов, которые не будут соответствовать, но которые имеют очень большое количество возможностей в своих деревьях поиска. Классический пример - использование вложенных неограниченных повторов.

Внутри PCRE использует функцию match (), которую он вызывает повторно (иногда рекурсивно). Ограничение, установленное параметром match_limit, накладывается на количество вызовов этой функции во время сопоставления, что имеет эффект ограничения количества обратного отслеживания, которое может иметь место. Для шаблонов, которые не привязаны, счет начинается с нуля для каждой позиции в строке темы.

Значение по умолчанию для ограничения может быть установлено при построении PCRE; значение по умолчанию - 10 миллионов, что касается всех случаев, кроме самых крайних. Вы можете изменить значение по умолчанию, добавив в pcre_exec () блок pcre_extra, в котором установлен match_limit, а в поле флагов установлен PCRE_EXTRA_MATCH_LIMIT. Если предел превышен, pcre_exec () возвращает PCRE_ERROR_MATCHLIMIT.

Поле match_limit_recursion похоже на match_limit, но вместо ограничения общего количества вызовов match () оно ограничивает глубину рекурсии. Глубина рекурсии меньше общего количества вызовов, потому что не все вызовы match () рекурсивны. Это ограничение используется только в том случае, если оно меньше match_limit.

Поскольку встроенная библиотека PCRE по умолчанию - 10000000, я предполагаю, что для mod_security предлагается более низкая настройка, чтобы запросы не задерживались в течение длительного времени.