2016-03-04 8 views
0

Я планировал предоставить поддержку регулярных выражений в моем сервисе, чтобы мои пользователи могли настраивать регулярное выражение, и строка будет обрабатываться, если она соответствует регулярному выражению.Не имея круглых скобок только в регулярном выражении, это предотвратит ReDOS?

Потом я наткнулся на эти статьи:

OWASP ReDOS

blog.makensi.es

И обнаружили, что простое регулярное выражение может иметь катастрофические последствия в моих серверах.

Мне нужны только базовые способности соответствия.

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

Я прав в этом или отсутствует что-нибудь?

+0

Что, просто держите все круглые скобки, даже не глядя? Если на самом деле нужны параны, и вы их удаляете, результат может быть синтаксически действительным, но это будет другое регулярное выражение. И что вы будете делать с парсерами, которые ускользают с помощью обратных косых черт, или в классах персонажей, или в обоих? Используете ли вы аромат регулярного выражения, который поддерживает группы, не захватывающие захват, атомные группы, lookaheads, lookbehinds, группы сброса сброса, условные выражения ...? –

+0

Я пытаюсь предоставить поддержку соответствия шаблону. Я думал, что могу просто использовать регулярное выражение, но узнал о злых регулярных выражениях. Я просто хотел знать, не предотвратит ли хоть какую-то поддержку группировку любого зла. Но из принятого ответа узнал, что этого будет недостаточно. – Vigneshwaran

ответ

1

Да, это был бы наивный подход и сделал бы ваш сервер восприимчивым к атакам DOS.

На самом деле первое звено вы дали себе довольно хорошее и бесплатное к нему вы можете посмотреть по адресу: How can I recognize an evil regex?

Однако, похоже, что это трудная задача, чтобы обнаружить такие дурные регулярные выражения. Это зависит от того, какой риск вы хотите предпринять? Одним из решений может быть создание механизма для создания процессов/потоков (зависит от вашей платформы), который оценивает входные строки с заданным регулярным выражением и устанавливает для него тайм-аут. Как только процесс займет много времени (пока вы можете позволить себе), вы можете его убить.

1

Риск, который вы запускаете, сильно зависит от вашей конкретной библиотеки регулярных выражений. Классический «run-away» RE (essentally) aa? повторяется N раз, сопоставляется со строкой, которая равна N a. Это выполняется примерно в экспоненциальном времени в библиотеках по умолчанию PHP, Python и Perl и примерно линейно во времени для CL-PCRE (perl-совместимый) Common Lisp и пакета regexp Go (регулярные выражения POSIX).

Отметьте, что aa?aa?aa? не имеет круглых скобок.

+0

Это отвечает на мой вопрос. Также передал этот вопрос http://stackoverflow.com/questions/12841970/how-can-i-recognize-an-evil-regex?lq=1 и обнаружил, что 'a {0,1000} a {0,1000 } 'и' a * b * [ac] * $ 'также являются злыми регулярными выражениями, даже если они не имеют круглых скобок. – Vigneshwaran

 Смежные вопросы

  • Нет связанных вопросов^_^