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('[email protected]'));



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

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

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