Как избежать медленных регулярных выражений и катастрофического бэктрекинга (ReDoS), который парализует сервис.
Большинство регулярных выражений очень быстры, но некоторые шаблоны могут увеличивать время выполнения экспоненциально в зависимости от длины ввода. Это называется катастрофическим бэктрекингом, а атака, при которой вредоносный ввод останавливает сервер, называется ReDoS (отказ в обслуживании через регулярные выражения).
Самая частая причина — вложенные квантификаторы. Когда повторение накладывается на повторение, как в (a+)+ или (.*)*, и последующая часть не совпадает, движок перебирает все возможные разбиения и «взрывается». Неоднозначное чередование вроде (a|a)* вызывает ту же проблему.
Ключ к профилактике — устранить неоднозначность. Объедините перекрывающиеся повторения в одно, сузьте диапазон, используя [^x]* вместо .*, и по возможности рассмотрите атомарные группы или притяжательные квантификаторы (в JavaScript их нет). Ограничение длины ввода тоже эффективно на практике.
Этот тестер выполняется в браузере, поэтому опасный шаблон лишь ненадолго замедлит вашу вкладку. Но прежде чем применять тот же шаблон на сервере к недоверенному вводу, обязательно проверьте производительность.