Выбор ответа Senior Безопасность бэкенда обновлено

ReDoS

Вопрос

Почему регулярка /^(a+)+$/ опасна для Node-сервера, проверяющего пользовательский ввод?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Перебор вариантов растёт экспоненциально и блокирует loop. Вложенные квантификаторы дают множество способов разбить строку.

Варианты ответа

  1. Она не поддерживается V8 и бросит SyntaxError
  2. Она съедает всю память под захватывающие группы
  3. Перебор вариантов растёт экспоненциально и блокирует loopправильный ответ
  4. Она опасна только с флагом g и lastIndex

Разбор

Вложенные квантификаторы дают множество способов разбить строку. Когда в конце совпадения нет, движок с возвратами пробует их все, время растёт экспоненциально. Пока регулярка считает, однопоточный сервер не отвечает никому. Защита: простые регулярки без вложенных квантификаторов, лимит длины ввода, линтеры на опасные шаблоны.

  • V8 такую регулярку поддерживает.
  • Проблема во времени, а не в памяти.
  • Флаг g тут ни при чём.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме