Я хочу добавить функцию на свой сайт, чтобы пользователи могли искать тексты с помощью RegEx
. Но безопасно ли позволить пользователям делать что-то подобное?
preg_match('/' . $user_input_regex . '/', $subject);
Существует возможная атака на этот код, называемый атакой ReDoS (регулярное выражение «Отказ в обслуживании»).
Регулярное выражение «Отказ в обслуживании» (ReDoS) – это атака «Отказ в обслуживании», которая использует тот факт, что большинство реализаций регулярных выражений могут достигать экстремальных ситуаций, которые заставляют их работать очень медленно (экспоненциально связанные с размером ввода). Затем злоумышленник может вызвать программу с использованием регулярного выражения, чтобы войти в эти экстремальные ситуации, а затем повесить в течение очень долгого времени.
В частности, с preg_match
существует известная проблема, которая может вызвать ошибку сегментации PHP.
Таким образом, ответ отрицательный, он небезопасен из-за таких проблем.
Разумеется, вы не должны доверять пользовательскому вводу, поэтому это зависит от того, что вы делаете с вводом. В данном случае вы должны, по крайней мере, избегать использованного разделителя (обратной косой черты) в пользовательском вводе, чтобы обеспечить регулярное выражение.