<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[RegExp.escape в ECMAScript 2026: защита от инъекций без библиотек]]></title><description><![CDATA[<p dir="auto"><img src="/assets/uploads/files/64/ef/38/1773740906782-generated_1773740873761-resized.webp" alt="Обложка: RegExp.escape в ECMAScript 2026: защита от инъекций без библиотек" class=" img-fluid img-markdown" /></p>
<p dir="auto">В ECMAScript 2026 появился метод <strong>RegExp.escape</strong>. Он экранирует специальные символы в строке, чтобы её можно было безопасно использовать в регулярных выражениях. Это решает проблему создания динамических RegExp из пользовательского ввода без риска инъекций.</p>
<p dir="auto">Раньше для экранирования приходилось писать свои функции или тянуть библиотеки. Теперь всё встроено в JavaScript. Метод защитит от неожиданного поведения, когда точка или звёздочка в вводе ломают паттерн. Полезно для поиска, замены и валидации на фронте и бэкенде.</p>
<h2>Что делает RegExp.escape</h2>
<p dir="auto">Метод <strong>RegExp.escape</strong> берёт строку и заменяет все специальные символы RegExp на их экранированные версии. Это гарантирует, что строка будет трактоваться как литерал, а не как часть синтаксиса регулярки. Например, если пользователь введёт “foo.bar”, без экранирования точка станет метасимволом - любой символ. С методом это превратится в “foo.bar” - поиск точного совпадения.</p>
<p dir="auto">Представьте поиск по тексту, где вводят “(<em>.</em>)”. Без escape это матчит всё подряд из-за звёздочек и скобок. Метод выдаст “(*.*)”, и RegExp сработает предсказуемо. Это критично для защиты от <strong>RegExp injection</strong>, когда злоумышленник вставляет свой паттерн. В ECMAScript 2026 метод официально вошёл в спецификацию, поддержка в браузерах уже есть.</p>
<p dir="auto">Вот что экранирует метод:</p>
<ul>
<li>Символы вроде <div class="plugin-markdown"><input type="checkbox" />\ ( ) { } |</div></li>
<li>Обратные слеши и другие потенциально опасные</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Входная строка</th>
<th>RegExp.escape результат</th>
</tr>
</thead>
<tbody>
<tr>
<td>“foo.bar”</td>
<td>“\x66oo.bar”</td>
</tr>
<tr>
<td>“(<em>.</em>)”</td>
<td>“(*.*)”</td>
</tr>
<tr>
<td>“<img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f60a.png?v=a1e94250dac" class="not-responsive emoji emoji-android emoji--blush" style="height:23px;width:auto;vertical-align:middle" title="😊" alt="😊" /> <em>_</em>”</td>
<td>“<img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f60a.png?v=a1e94250dac" class="not-responsive emoji emoji-android emoji--blush" style="height:23px;width:auto;vertical-align:middle" title="😊" alt="😊" />\x20*_*”</td>
</tr>
<tr>
<td>“\d”</td>
<td>“\d”</td>
</tr>
</tbody>
</table>
<p dir="auto"><em>Важно</em>: Метод не трогает обычные символы, только потенциально опасные. Работает с Unicode.</p>
<h2>Проблемы без RegExp.escape</h2>
<p dir="auto">До ECMAScript 2026 разработчики вручную экранировали строки. Это приводило к ошибкам: забывали символ или неправильно обрабатывали Unicode. Пользователь вводит “<a href="https://example.com" target="_blank" rel="noopener noreferrer">https://example.com</a>”, а вы ищете домен - и точка в URL превращает паттерн в катастрофу. Результат: неверные замены или DoS от сложных паттернов.</p>
<p dir="auto">Второй пример - валидация email. Динамический ввод с “user@(.*)” может захватить лишнее. Ручное экранирование ненадёжно, особенно с библиотеками вроде lodash.escapeRegExp, которые устаревают. Теперь <strong>RegExp.escape</strong> решает это нативно, без зависимостей. Поддержка в Chrome 136, Firefox 134 - уже можно тестировать.</p>
<p dir="auto">Типичные проблемы:</p>
<ul>
<li><em>RegExp DoS (ReDoS)</em> от пользовательских звёздочек</li>
<li>Инъекции в replace(), где паттерн меняет логику</li>
<li>Ошибки с многострочными строками и флагами</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Подход</th>
<th>Плюсы</th>
<th>Минусы</th>
</tr>
</thead>
<tbody>
<tr>
<td>Ручное экранирование</td>
<td>Полный контроль</td>
<td>Ошибки, сложно с Unicode</td>
</tr>
<tr>
<td>Библиотеки</td>
<td>Быстро</td>
<td>Зависимости, размер бандла</td>
</tr>
<tr>
<td>RegExp.escape</td>
<td>Нативно, точно</td>
<td>Только с 2026</td>
</tr>
</tbody>
</table>
<h2>Примеры использования для защиты</h2>
<p dir="auto">Возьмём функцию удаления домена из текста. Без escape ввод “<a href="http://developer.mozilla.org" target="_blank" rel="noopener noreferrer">developer.mozilla.org</a>” сломается на точках. С методом: const escaped = RegExp.escape(domain); new RegExp(<code>https?://${escaped}</code>, ‘g’). Метод экранирует только нужное, оставляя текст читаемым.</p>
<p dir="auto">Ещё случай - поиск в логах. Пользователь ищет “error”, скобки и цифры станут метасимволами. После escape: “error[500]” - точный матч. Для replaceAll() это идеально: text.replaceAll(new RegExp(escaped, ‘g’), ‘’). В мобильной разработке или TypeScript это упрощает код без полифиллов.</p>
<p dir="auto">Практические кейсы:</p>
<ul>
<li>Поиск по пользовательскому запросу в чате</li>
<li>Валидация форм с динамическими паттернами</li>
<li>Обработка URL и путей в SPA</li>
<li><em>Фильтрация спама</em> по ключевым словам из БД</li>
</ul>
<pre><code class="language-javascript">const userInput = "user*(admin)";
const safe = RegExp.escape(userInput);
const re = new RegExp(`^${safe}$`);
console.log(re.test("user*(admin)")); // true
</code></pre>
<h2>Защита от инъекций на практике</h2>
<p dir="auto">RegExp инъекции - когда ввод меняет логику паттерна. Пример: поиск “test”, вводят “.*”. Без escape матчит всё. С <strong>RegExp.escape</strong> ввод экранируется в “.*” - безопасно. В бэкенде Node.js это спасает от ReDoS, в фронте - от багов в UI.</p>
<p dir="auto">Метод работает с флагами u и v, поддерживает эмодзи и спецсимволы. Для баз данных или API - берите ввод, escape, стройте RegExp. Нет нужды в lodash или core-js полифиллах. Тестируйте в Firefox - там с января 2025.</p>
<p dir="auto">Преимущества в production:</p>
<ul>
<li><em>Размер кода</em> меньше без библиотек</li>
<li>Предсказуемость в команде</li>
<li>Совместимость с ECMAScript 2026</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Сценарий</th>
<th>Без escape</th>
<th>С RegExp.escape</th>
</tr>
</thead>
<tbody>
<tr>
<td>URL домен</td>
<td>Ломается на .</td>
<td>Точный матч</td>
</tr>
<tr>
<td>Email</td>
<td>Захватывает лишнее</td>
<td>Безопасно</td>
</tr>
<tr>
<td>Логи</td>
<td>ReDoS риск</td>
<td>Защищено</td>
</tr>
</tbody>
</table>
<h2>Нативный escape меняет подходы</h2>
<p dir="auto"><strong>RegExp.escape</strong> закрывает пробел в JS, где раньше полагались на хаки. Осталось место для доработки: пока нет поддержки в старых браузерах, но полифиллы просты. Стоит подумать о комбинации с /v флагом для сетевых строк и Promise.try для асинхронных поисков.</p>
<p dir="auto">Метод упрощает код, но требует привыкания к экранированным строкам в логах. В будущем ждём больше нативных инструментов для динамических RegExp. Это шаг к безопасному JS без внешних deps.</p>
]]></description><link>https://forum.exlends.ru/topic/1690/regexp.escape-v-ecmascript-2026-zashita-ot-inuekcij-bez-bibliotek</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:59:10 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/1690.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 17 Mar 2026 09:48:27 GMT</pubDate><ttl>60</ttl></channel></rss>