
DOMPurify — это DOM-only, сверхбыстрый, сверхтолерантный XSS-санитайзер для HTML, MathML и SVG. DOMPurify работает с безопасным набором настроек по умолчанию, но предлагает множество возможностей конфигурации и хуков. Демо:
DOMPurify — это сверхбыстрый, чрезвычайно устойчивый XSS-санитайзер для HTML, MathML и SVG, работающий исключительно с DOM.
Он также очень прост в использовании и освоении. DOMPurify был запущен в феврале 2014 года и с тех пор достиг версии v3.4.15.
DOMPurify работает как JavaScript и поддерживается во всех современных браузерах (Safari (10+), Opera (15+), Edge, Firefox и Chrome — а также практически во всём остальном, что использует Blink, Gecko или WebKit). Он не ломается в MSIE или других устаревших браузерах. Он просто ничего не делает.
Обратите внимание, что DOMPurify v2.5.9 — последняя версия с поддержкой MSIE. Для важных обновлений безопасности, совместимых с MSIE, используйте ветку 2.x.
Наши автоматизированные тесты охватывают 9 комбинаций браузер/ОС на текущих движках (Chromium, Firefox и WebKit в Ubuntu, macOS и Windows) при каждом push, а отдельная матрица повторно прогоняет набор тестов на снимках старых движков (примерно до Chromium 110, Firefox 108 и WebKit 16.4, возрастом около трёх лет), чтобы регрессии в устаревших браузерах тоже выявлялись. Мы также запускаем Node.js v20, v22, v24, v25 и v26 с DOMPurify на jsdom. Более старые версии Node, как известно, тоже работают, но, э-э... без гарантий.
DOMPurify написан специалистами по безопасности, обладающими обширным опытом в веб-атаках и XSS. Не бойтесь. Для получения дополнительной информации также прочитайте о наших Целях безопасности и модели угроз. Пожалуйста, прочитайте. Серьёзно. А если вам нравятся кровавые подробности, страница Классы атак и история обходов каталогизирует приёмы мутации парсера, пространств имён, перезаписи (clobbering) и шаблонов, от которых защищается DOMPurify.
Проект DOMPurify вдохновил создание HTML Sanitizer API, который уже поставляется во многих браузерах. Та же возможность сейчас стандартизируется непосредственно в спецификации WHATWG HTML.
DOMPurify очищает HTML и предотвращает XSS-атаки. Вы можете передать DOMPurify, например, строку, полную грязного HTML, и он вернёт строку (если не настроено иное) с чистым HTML. DOMPurify удалит всё, что содержит опасный HTML, и тем самым предотвратит XSS-атаки и другие неприятности. Он также чертовски быстр. Мы используем технологии, предоставляемые браузером, и превращаем их в XSS-фильтр. Чем быстрее ваш браузер, тем быстрее будет DOMPurify.
Это просто. Просто подключите DOMPurify на своём сайте.
### Использование минифицированной и протестированной production-версии (доступна source-map)```html
<script type="text/javascript" src="dist/purify.min.js"></script>
После этого вы можете очищать строки, выполнив следующий код:```js const clean = DOMPurify.sanitize(dirty);
Или, возможно, это, если вы любите работать с Angular или подобными:```js
import DOMPurify from 'dompurify';
const clean = DOMPurify.sanitize('<b>hello there</b>');
Полученный HTML можно записать в DOM-элемент с помощью innerHTML или в DOM с помощью document.write(). Это полностью на ваше усмотрение.
Обратите внимание, что по умолчанию мы разрешаем HTML, SVG и MathML. Если вам нужен только HTML, что может быть очень распространённым случаем использования, вы также можете легко это настроить:```js
const clean = DOMPurify.sanitize(dirty, { USE_PROFILES: { html: true } });
### Есть ли здесь подводные камни?
Что ж, обратите внимание: если вы _сначала_ санируете HTML, а _затем_ изменяете его, вы можете легко **свести на нет эффект санитизации**. Если вы передаёте санированную разметку в другую библиотеку _после_ санитизации, убедитесь, что эта библиотека не манипулирует HTML самостоятельно. См. [Security Goals & Threat Model](https://github.com/cure53/DOMPurify/wiki/Security-Goals-&-Threat-Model) для рецептов безопасного использования и тегов/атрибутов, о которых стоит подумать дважды, а также [Attack Classes & Bypass History](https://github.com/cure53/DOMPurify/wiki/Attack-Classes-&-Bypass-History) о том, почему постобработка и изменение контекста разметки сводят санитизацию на нет.
### Хорошо, логично, двигаемся дальше
После санитизации разметки вы также можете взглянуть на свойство `DOMPurify.removed` и узнать, какие элементы и атрибуты были удалены. Пожалуйста, **не используйте** это свойство для принятия каких-либо решений, критичных для безопасности. Это всего лишь небольшой помощник для любопытных умов.
### Запуск DOMPurify на сервере
Технически DOMPurify также работает на стороне сервера с Node.js. Наша поддержка стремится следовать [циклу релизов Node.js](https://nodejs.org/en/about/previous-releases).
Для запуска DOMPurify на сервере требуется наличие DOM, что, вероятно, никого не удивит. Обычно [jsdom](https://github.com/jsdom/jsdom) является инструментом выбора, и мы **настоятельно рекомендуем** использовать последнюю версию _jsdom_.