Можно ли использовать пользователя RegEx?

Я хочу добавить функцию на свой сайт, чтобы пользователи могли искать тексты с помощью RegEx. Но можно ли позволить пользователям делать что-то подобное?

preg_match('/' . $user_input_regex . '/', $subject);

Ответы

Ответ 1

Существует возможная атака на этот код, называемый ReDoS атака (регулярное выражение Отказ в обслуживании).

Регулярное выражение "Отказ службы" (ReDoS) - это атака "Отказ в обслуживании", которая использует тот факт, что большинство реализаций регулярных выражений могут достигать экстремальных ситуаций, которые заставляют их работать очень медленно (экспоненциально связанные с размером ввода). Затем злоумышленник может вызвать программу с использованием регулярного выражения, чтобы войти в эти экстремальные ситуации, а затем повесить в течение очень долгого времени.

В частности, с preg_match существует известная проблема, которые могут вызвать ошибку сегментации PHP.

Таким образом, ответ отрицательный, он небезопасен из-за таких проблем.

Ответ 2

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