Skip to main content

Предотвращайте ваше однопоточное выполнение от перегрузки злонамеренным RegEx

Объяснение в один абзац​

Риск, связанный с использованием регулярных выражений, - это вычислительные ресурсы, которые требуют анализа текста и сопоставления с заданным шаблоном. Для платформы Node.js, где доминирует однопотоковый цикл обработки событий, связанная с процессором операция, такая как разрешение шаблона регулярного выражения, сделает приложение не отвечающим на запросы. Избегайте RegEx, когда это возможно, или отложите задачу до выделенной библиотеки, например validator.js или safe-regex, чтобы проверить, безопасен ли шаблон RegEx.

Некоторые примеры OWASP уязвимых шаблонов RegEx:

  • (a|aa)+
  • ([a-zA-Z]+)*



Пример кода - Включение SSL/TLS с использованием платформы Express​

const saferegex = require('safe-regex');
const emailRegex = /^([a-zA-Z0-9])(([\-.]|[_]+)?([a-zA-Z0-9]+))*(@){1}[a-z0-9]+[.]{1}(([a-z]{2,3})|([a-z]{2,3}[.]{1}[a-z]{2,3}))$/;

// should output false because the emailRegex is vulnerable to redos attacks
console.log(saferegex(emailRegex));

// instead of the regex pattern, use validator:
const validator = require('validator');
console.log(validator.isEmail('liran.tal@gmail.com'));



Цитата из книги: "Уязвимое регулярное выражение известно как выражение, которое применяет повторение"​

Из книги Essential Node.js Security

Часто программисты используют RegEx для проверки того, что входные данные, полученные от пользователя, соответствуют ожидаемым условиям. Уязвимое регулярное выражение известно как выражение, которое применяет повторение к повторяющейся группе захвата, и где строка для сопоставления состоит из суффикса действительного сопоставленного шаблона и символов, которые не соответствуют группе захвата.