mirror of
https://github.com/goldbergyoni/nodebestpractices.git
synced 2025-10-27 19:17:13 +08:00
35 lines
3.0 KiB
Markdown
35 lines
3.0 KiB
Markdown
# Предотвращайте ваше однопоточное выполнение от перегрузки злонамеренным RegEx
|
||
|
||
### Объяснение в один абзац
|
||
|
||
Риск, связанный с использованием регулярных выражений, - это вычислительные ресурсы, которые требуют анализа текста и сопоставления с заданным шаблоном. Для платформы Node.js, где доминирует однопотоковый цикл обработки событий, связанная с процессором операция, такая как разрешение шаблона регулярного выражения, сделает приложение не отвечающим на запросы.
|
||
Избегайте RegEx, когда это возможно, или отложите задачу до выделенной библиотеки, например [validator.js](https://github.com/chriso/validator.js) или [safe-regex](https://github.com/substack/safe-regex), чтобы проверить, безопасен ли шаблон RegEx.
|
||
|
||
Некоторые [примеры OWASP](https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS) уязвимых шаблонов RegEx:
|
||
* (a|aa)+
|
||
* ([a-zA-Z]+)*
|
||
|
||
<br/><br/>
|
||
|
||
### Пример кода - Включение SSL/TLS с использованием платформы Express
|
||
|
||
```javascript
|
||
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'));
|
||
```
|
||
|
||
<br/><br/>
|
||
|
||
### Цитата из книги: "Уязвимое регулярное выражение известно как выражение, которое применяет повторение"
|
||
|
||
Из книги [Essential Node.js Security](https://leanpub.com/nodejssecurity)
|
||
> Часто программисты используют RegEx для проверки того, что входные данные, полученные от пользователя, соответствуют ожидаемым условиям. Уязвимое регулярное выражение известно как выражение, которое применяет повторение к повторяющейся группе захвата, и где строка для сопоставления состоит из суффикса действительного сопоставленного шаблона и символов, которые не соответствуют группе захвата.
|
||
|