Перейти к содержанию
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
exlends
Категории
  1. Главная
  2. Категории
  3. Языки программирования
  4. JavaScript
  5. RegExp.escape в ECMAScript 2026: защита от инъекций без библиотек

RegExp.escape в ECMAScript 2026: защита от инъекций без библиотек

Запланировано Прикреплена Закрыта Перенесена JavaScript
regexp.escapeecmascript 2026regexp инъекции
1 Сообщения 1 Постеры 3 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • hannadevH Не в сети
    hannadevH Не в сети
    hannadev
    написал отредактировано
    #1

    Обложка: RegExp.escape в ECMAScript 2026: защита от инъекций без библиотек

    В ECMAScript 2026 появился метод RegExp.escape. Он экранирует специальные символы в строке, чтобы её можно было безопасно использовать в регулярных выражениях. Это решает проблему создания динамических RegExp из пользовательского ввода без риска инъекций.

    Раньше для экранирования приходилось писать свои функции или тянуть библиотеки. Теперь всё встроено в JavaScript. Метод защитит от неожиданного поведения, когда точка или звёздочка в вводе ломают паттерн. Полезно для поиска, замены и валидации на фронте и бэкенде.

    Что делает RegExp.escape

    Метод RegExp.escape берёт строку и заменяет все специальные символы RegExp на их экранированные версии. Это гарантирует, что строка будет трактоваться как литерал, а не как часть синтаксиса регулярки. Например, если пользователь введёт “foo.bar”, без экранирования точка станет метасимволом - любой символ. С методом это превратится в “foo.bar” - поиск точного совпадения.

    Представьте поиск по тексту, где вводят “(.)”. Без escape это матчит всё подряд из-за звёздочек и скобок. Метод выдаст “(*.*)”, и RegExp сработает предсказуемо. Это критично для защиты от RegExp injection, когда злоумышленник вставляет свой паттерн. В ECMAScript 2026 метод официально вошёл в спецификацию, поддержка в браузерах уже есть.

    Вот что экранирует метод:

    • Символы вроде
      \ ( ) { } |
    • Обратные слеши и другие потенциально опасные
    Входная строка RegExp.escape результат
    “foo.bar” “\x66oo.bar”
    “(.)” “(*.*)”
    “😊 _” “😊\x20*_*”
    “\d” “\d”

    Важно: Метод не трогает обычные символы, только потенциально опасные. Работает с Unicode.

    Проблемы без RegExp.escape

    До ECMAScript 2026 разработчики вручную экранировали строки. Это приводило к ошибкам: забывали символ или неправильно обрабатывали Unicode. Пользователь вводит “https://example.com”, а вы ищете домен - и точка в URL превращает паттерн в катастрофу. Результат: неверные замены или DoS от сложных паттернов.

    Второй пример - валидация email. Динамический ввод с “user@(.*)” может захватить лишнее. Ручное экранирование ненадёжно, особенно с библиотеками вроде lodash.escapeRegExp, которые устаревают. Теперь RegExp.escape решает это нативно, без зависимостей. Поддержка в Chrome 136, Firefox 134 - уже можно тестировать.

    Типичные проблемы:

    • RegExp DoS (ReDoS) от пользовательских звёздочек
    • Инъекции в replace(), где паттерн меняет логику
    • Ошибки с многострочными строками и флагами
    Подход Плюсы Минусы
    Ручное экранирование Полный контроль Ошибки, сложно с Unicode
    Библиотеки Быстро Зависимости, размер бандла
    RegExp.escape Нативно, точно Только с 2026

    Примеры использования для защиты

    Возьмём функцию удаления домена из текста. Без escape ввод “developer.mozilla.org” сломается на точках. С методом: const escaped = RegExp.escape(domain); new RegExp(https?://${escaped}, ‘g’). Метод экранирует только нужное, оставляя текст читаемым.

    Ещё случай - поиск в логах. Пользователь ищет “error”, скобки и цифры станут метасимволами. После escape: “error[500]” - точный матч. Для replaceAll() это идеально: text.replaceAll(new RegExp(escaped, ‘g’), ‘’). В мобильной разработке или TypeScript это упрощает код без полифиллов.

    Практические кейсы:

    • Поиск по пользовательскому запросу в чате
    • Валидация форм с динамическими паттернами
    • Обработка URL и путей в SPA
    • Фильтрация спама по ключевым словам из БД
    const userInput = "user*(admin)";
    const safe = RegExp.escape(userInput);
    const re = new RegExp(`^${safe}$`);
    console.log(re.test("user*(admin)")); // true
    

    Защита от инъекций на практике

    RegExp инъекции - когда ввод меняет логику паттерна. Пример: поиск “test”, вводят “.*”. Без escape матчит всё. С RegExp.escape ввод экранируется в “.*” - безопасно. В бэкенде Node.js это спасает от ReDoS, в фронте - от багов в UI.

    Метод работает с флагами u и v, поддерживает эмодзи и спецсимволы. Для баз данных или API - берите ввод, escape, стройте RegExp. Нет нужды в lodash или core-js полифиллах. Тестируйте в Firefox - там с января 2025.

    Преимущества в production:

    • Размер кода меньше без библиотек
    • Предсказуемость в команде
    • Совместимость с ECMAScript 2026
    Сценарий Без escape С RegExp.escape
    URL домен Ломается на . Точный матч
    Email Захватывает лишнее Безопасно
    Логи ReDoS риск Защищено

    Нативный escape меняет подходы

    RegExp.escape закрывает пробел в JS, где раньше полагались на хаки. Осталось место для доработки: пока нет поддержки в старых браузерах, но полифиллы просты. Стоит подумать о комбинации с /v флагом для сетевых строк и Promise.try для асинхронных поисков.

    Метод упрощает код, но требует привыкания к экранированным строкам в логах. В будущем ждём больше нативных инструментов для динамических RegExp. Это шаг к безопасному JS без внешних deps.

    1 ответ Последний ответ
    0

    Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.

    Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.

    С вашими комментариями этот пост мог бы стать ещё лучше 💗

    Зарегистрироваться Войти

    Категории

    • Главная
    • Новости
    • Фронтенд
    • Бекенд
    • Языки программирования

    Контакты

    • Сотрудничество
    • info@exlends.com
    • Наш чат
    • Наш ТГ канал

    © 2024 - 2026 ExLends, Inc. Все права защищены.

    Политика конфиденциальности
    • Войти

    • Нет учётной записи? Зарегистрироваться

    • Войдите или зарегистрируйтесь для поиска.
    • Первое сообщение
      Последнее сообщение
    0
    • Лента
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы