Files
frontend/SECURITY_ESLINT_REVIEW.md
ksv741 061ec708c6 chore: guard unsafe DOM HTML with ESLint #18
Enable no-unsanitized recommended rules and verify TypeScript DOM sink diagnostics.
2026-09-28 16:36:40 +03:00

7.2 KiB
Raw Permalink Blame History

Security-плагины ESLint

Проверено 28 сентября 2026 года для frontend: ESLint 10.11.0, TypeScript и React 19. Рекомендация — добавить только eslint-plugin-no-unsanitized@4.1.5 с полным configs.recommended. Решение реализовано: пакет добавлен в devDependencies, полный recommended подключён в ESLint. Ниже сохранены результаты исследования до установки.

Все пакеты из раздела Security

Источник списка: awesome-eslint / Security. Версии и даты ниже — опубликованные latest из npm на момент проверки. Широкий peer range сам по себе не доказывает работоспособность.

Пакет Версия; публикация Заявленный peer ESLint Решение для frontend
no-unsanitized 4.1.5; 2026-02-19 ^9 || ^10 Добавить: проверяет опасные присваивания и вызовы native DOM HTML API. Flat recommended включает property и method как errors.
no-secrets 2.3.3; 2026-03-01 >=5 Не добавлять: поиск секретов по entropy/patterns существенно пересекается с существующими Gitleaks и SonarJS. Flat config поддерживается; отсутствие рекомендации связано с дублированием.
pii 1.0.2; 2021-04-13 >=4.19.1 Не добавлять: правило падает на ESLint 10. Проверяет email/даты рождения/IP/телефоны в литералах и комментариях, а не потоки персональных данных; потребует исключений для тестовых данных.
pg 1.4.14; 2026-08-06 ^8.0.0 || ^9.0.0 || ^10.0.0 Не добавлять: предназначен для Node.js с pg, которого во frontend нет. Пакет deprecated и переименован в eslint-plugin-postgresql-security; старое имя больше не обновляется.
security 4.1.0; 2026-09-27 Не указан Уже установлен с recommended. Ориентирован главным образом на Node.js; не заменяет проверки DOM.
xss 0.1.12; 2022-06-27 Не указан Не добавлять: правило падает на ESLint 10. Проверяет HTML-конкатенации/соглашения об именах и присваивания location.href; это не специализированная проверка React/TSX.

Что добавляет no-unsanitized

Правило property проверяет присваивания innerHTML/outerHTML; method проверяет, в частности, insertAdjacentHTML, document.write и document.writeln. В исходнике method также есть проверки createContextualFragment, setHTMLUnsafe и dynamic import. Следовательно, перед включением нужно прогнать весь lint, а не только HTML-примеры.

До подключения no-unsanitized eslint.config.mjs уже включал React-проверку dom-no-dangerously-set-innerhtml и security-правила SonarJS. Предварительная проверка через локальный ESLint.lintText показала пробел: функция с element.innerHTML = html не получала security-диагностику, тогда как JSX dangerouslySetInnerHTML получал диагностику React. Это различие в покрытии, не обнаруженная уязвимость приложения: таких production DOM-присваиваний при поиске не найдено.

Плагин понимает TS-синтаксис через TypeScript parser, включая as-выражения, но не использует TypeScript type checker. Он не доказывает безопасность всех потоков данных. У версии 4.1.5 нет runtime dependencies; Prettier указан только в devDependencies самого плагина и при его обычной установке потребителем не устанавливается.

Проверка совместимости без установки

Опубликованные npm tarballs прочитаны в /tmp; использованы локальные ESLint 10.11.0 и @typescript-eslint/parser, без lifecycle-скриптов пакетов. Через Linter.verify с recommended no-unsanitized проверены:

  • innerHTML/outerHTML с параметром html: string — обе ошибки найдены;
  • insertAdjacentHTML/document.write/document.writeln — все три ошибки найдены;
  • innerHTML = html as string — ошибка найдена;
  • безопасный textContent и обычная TSX-интерполяция — без ошибок.

Отдельный запуск реальных правил pii/no-email и xss/no-location-href-assign завершился TypeError: context.getSourceCode is not a function на ESLint 10. Это подтверждает несовместимость проверенных версий, несмотря на широкий или отсутствующий peer range. Обходы через legacy adapters не предлагаются.

Поиск секретов уже выполняют security workflow и pre-commit Gitleaks; SonarJS дополнительно проверяет hardcoded secrets. Добавление ещё одного secret-scanner в ESLint сейчас не оправдано.

Активацию обоих правил и примеры опасных DOM-вставок проверяет npm run test:lint; интеграцию зависимости — полный npm run verify.