Вектор атаки регулярного выражения? - PullRequest
2 голосов
/ 24 декабря 2009

Как можно «параметризовать» переменные, вводимые в Regex в Ruby? Например, я делаю следующее:

q = params[:q]
all_values.collect { | col | [col.name] if col.name =~ /(\W|^)#{q}/i }.compact

Поскольку это (# {q}) - переменная из ненадежного источника (строка запроса), я должен предположить, что это может быть вектор атаки. Здесь есть лучшие практики?

Ответы [ 2 ]

3 голосов
/ 24 декабря 2009

Попробуйте Regexp.escape :

>> Regexp.escape('foo\bar\baz$+')
=> "foo\\\\bar\\\\baz\\$\\+"

Ваш код будет выглядеть примерно так:

q = params[:q]
re = Regexp.escape(q)
all_values.collect { | col | [col.name] if col.name =~ /(\W|^)#{re}/i }.compact
2 голосов
/ 24 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...