Що таке межі PCRE?


11

У ModSecurity є PCRE limits exceededпомилки.

Я знаю, що можу це виправити, встановивши такі правила:

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000

Але, що ці правила насправді виконують? Що означає рекурсія PCRE, встановлену на 150 000? Які отвори в безпеці я пропускаю, встановлюючи такі високі? Що означає recursionі що limitозначає?

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


Я редагую цю публікацію, щоб змінити тег "perl" на "pcre". PCRE - це не Perl, незважаючи на те, що в абревіатурі ви б повірили.
Енді Лестер

Відповіді:


13

Вони, здається, є внутрішніми налаштуваннями для двигуна 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_limit.

Оскільки вбудована за замовчуванням бібліотека PCRE становить 10000000, я здогадуюсь, що нижча настройка пропонується для mod_security, щоб запобігти затримці запитів протягом тривалого часу.


Схоже, модна безпека має значення за замовчуванням 1500 , що значно нижче 1М. Значення ОП 150000 буде тоді збільшувати показник, а не зменшувати його.
Пол Мугель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.