Кодировщик HTML-сущностей
Онлайн-конвертация символов HTML-сущностей, кодирование и декодирование, эффективная защита от XSS-атак
Выберите способ конвертации
Что такое кодирование HTML-сущностей?
Кодирование HTML-сущностей — это механизм преобразования специальных символов в ссылки на сущности HTML. В HTML некоторые символы имеют особое значение (например, <, >, &), и если их нужно отобразить как есть, используется кодирование сущностей. Есть две формы: именованные сущности (например, <) и числовые сущности (например, <). Именованные более читаемы, числовые могут представлять любой символ Unicode. HTML-encoding важен, когда текст нужно вставить в HTML без интерпретации как разметки. Символы <, >, &, кавычки и апострофы иначе могут изменить теги, атрибуты или entities. Инструмент полезен для примеров, templates, CMS-контента и отладки XSS-проблем. Контекст решает многое: HTML body, атрибуты, URL, JavaScript и CSS требуют разных правил escaping, поэтому результат нужно применять в правильном месте.
Как использовать
Как использовать
- Введите или вставьте текст для преобразования в левое поле ввода
- Нажмите нужную кнопку кодирования или декодирования
- Результат автоматически отобразится справа
- Нажмите «Копировать», чтобы скопировать результат в буфер обмена
Методы преобразования
Горячие клавиши
- Ctrl + EHTML Entity Encode
- Ctrl + DHTML Entity Decode
Советы по кодированию
- Кодируйте видимый пользователю текст перед вставкой в HTML-код, особенно если он может содержать угловые скобки, кавычки или амперсанды.
- Кодирование HTML-сущностей помогает предотвратить интерпретацию разметки, но это лишь одна часть защиты от XSS и не заменяет контекстное экранирование вывода.
Применение
Технический принцип
HTML использует два вида символьных ссылок, определённых WHATWG HTML Living Standard. Именованные символьные ссылки начинаются с & и заканчиваются на ;, берутся из таблицы entities.json, поддерживаемой WHATWG (около 2231 имени в текущей спецификации, включая устаревшие алиасы без завершающей точки с запятой, такие как & без ;). Числовые символьные ссылки используют кодовые точки Unicode в десятичном (<) или шестнадцатеричном (<) формате и могут кодировать любой символ от U+0000 до U+10FFFF, за исключением диапазона суррогатов U+D800-U+DFFF. Пять символов, которые ОБЯЗАТЕЛЬНО должны быть экранированы для сохранения синтаксической безопасности HTML: & (&), < (<), > (>), " (") и ' ('); обратите внимание, что ' является частью XML и HTML5, но НЕ допустим в HTML 4.01, поэтому OWASP рекомендует числовую форму ' для атрибутов, разделённых двойными кавычками, которые должны корректно обрабатываться устаревшими парсерами. Кодирование в этом инструменте представляет собой однопроходную замену: порядок важен, поскольку & должен экранироваться первым, иначе префиксы сущностей, вставленные для < и >, будут повторно экранированы в &lt;. Декодирование использует парсер HTML браузера, присваивая входные данные innerHTML отсоединённого элемента и считывая textContent обратно; это направляет выполнение к официальному конечному автомату токенизатора в спецификации HTML (разделы 13.2.5.72-80), который корректно обрабатывает именованные, десятичные и шестнадцатеричные формы, включая некорректные входные данные, такие как отсутствующие точки с запятой. Числовое кодирование для режима полного кодирования обходит строку кодовую точку за кодовой точкой, используя String.prototype.codePointAt для обработки астральных символов, занимающих суррогатную пару UTF-16 (например, эмодзи U+1F600 становится 😀, а не два суррогатных значения). Предотвращение XSS требует контекстно-зависимого экранирования, а не просто кодирования HTML-сущностей. OWASP Cross-Site Scripting Prevention Cheat Sheet определяет пять различных контекстов: тело HTML, атрибут HTML (в кавычках и без), данные JavaScript (внутри <script>), CSS и URL. Экранирование HTML-сущностей покрывает только контексты 1 и 2. Для контекстов JavaScript следует использовать \xHH или \uHHHH через JSON.stringify, контексты URL требуют encodeURIComponent (RFC 3986 percent-encoding), а инлайн-обработчики событий объединяют правила, поскольку их значения проходят через парсеры и HTML, и JavaScript. Заголовок Content-Security-Policy с script-src 'self' и удалённым 'unsafe-inline' — это современный уровень защиты в глубине, который перехватывает ошибки экранирования, а DOM-приёмники, такие как innerHTML, document.write и setAttribute('on*', ...), следует заменить на textContent или управляемые фреймворком привязки (JSX в React, шаблоны с двойными фигурными скобками в Vue), которые экранируют по умолчанию.
- Именованные ссылки: около 2231 записи в WHATWG entities.json; пять обязательных к экранированию имён — & < > " ' (' только для HTML5/XML, не для HTML 4.01)
- Числовые ссылки: десятичные &#DDDDD; и шестнадцатеричные &#xHHHH; покрывают U+0000 до U+10FFFF; суррогаты U+D800-U+DFFF и U+0000 NULL недопустимы по спецификации HTML
- Порядок экранирования: & должен заменяться первым, иначе вставленный префикс & для последующих экранирований будет дважды закодирован; кодирование имеет сложность O(n) с таблицей из 5 элементов
- Декодирование через DOMParser: присвоение innerHTML отсоединённого элемента вызывает токенизатор спецификации HTML (Character reference state, разделы 13.2.5.72-80), который обрабатывает устаревшие сущности без завершающих точек с запятой
- Обработка астральных символов: используйте String.prototype.codePointAt и итерацию for...of, чтобы эмодзи и символы расширения CJK B (U+10000+) генерировали один &#NNNNN;, а не две суррогатные ссылки
- Контекстно-зависимое экранирование (правило #0 OWASP XSS Prevention Cheat Sheet): тело HTML, атрибут HTML, JavaScript, CSS и URL требуют различных способов экранирования; только HTML-сущности не останавливают XSS в приёмниках JS или URL
- Защита в глубину: Content-Security-Policy script-src 'self' (по аналогии с RFC), очистка DOMPurify по списку разрешённых для редактируемого контента и предпочтение textContent/innerText вместо innerHTML в обычном DOM-коде
Примеры
Базовое кодирование элемента
Вход: <script>alert(1)</script>
Выход: <script>alert(1)</script>
Применение: предотвратить интерпретацию браузером текста как реального тега при отображении пользовательского контентаКодирование значения атрибута
Вход: <div title="Hello & world">
Выход: <div title="Hello & world">
Примечание: кавычки и амперсанд внутри атрибута кодируются сущностями, чтобы значение не могло выйти за пределы кавычекОтображение URL на странице
Вход: search?q=hello&lang=en
Выход: search?q=hello&lang=en
Применение: страница должна кодировать & перед вставкой URL в HTML, иначе парсер может счесть остальное искажённой сущностьюНе-ASCII символы (полное кодирование)
Вход: CJK-символы, например 中文
Выход: полная числовая форма UTF-8 中文 (или именованные сущности, если страница их поддерживает)
Применение: безопасное встраивание произвольного Unicode в устаревший HTML; современные страницы обычно полагаются на UTF-8Часто задаваемые вопросы
Какие символы преобразует HTML-кодирование?
Пять зарезервированных в SGML символов: & → &, < → <, > → >, " → ", ' → ' (или '). Дополнительно не-ASCII символы можно превратить в числовые сущности (&#xNN;) для устаревших систем, не дружащих с UTF-8.
Когда нужно HTML-кодирование?
Каждый раз, когда пользовательский текст вставляется в HTML-содержимое. Отсутствие кодирования — главная причина XSS-уязвимостей. Кодируйте пользовательские данные для тела HTML, значений атрибутов, контекста JavaScript, CSS и URL — у каждого контекста свои нюансы.
В чём разница между ' и '?
Обе сущности выводят одинарную кавычку. ' появилась в HTML5 и не валидна в HTML4 и старых почтовых клиентах. Если результат может попадать в старые системы, используйте '. По умолчанию инструмент выдаёт ' для максимальной совместимости.
Почему в выводе всё ещё остаётся &?
Если на входе уже была сущность вроде &, при кодировании получится &amp; — и это правильно: исходный амперсанд был обычным символом, а не сущностью. Если источник уже закодирован сущностями, сначала декодируйте его.
Кодируются ли эмодзи?
Эмодзи — это валидный Unicode, и современный HTML обрабатывает их как обычные символы; кодировать их не нужно, если только целевая система не настаивает на ASCII. Включите опцию «числовые сущности для не-ASCII», чтобы превратить их в форму &#xNNNN;.
HTML-кодирование — это то же самое, что URL-кодирование?
Нет. URL-кодирование (процентное) заменяет небезопасные символы на последовательности %NN для использования в URL. HTML-кодирование заменяет их на именованные или числовые сущности для использования в HTML. Применяйте подходящий вид для нужного контекста — смешение ведёт к багам с двойным кодированием.
Преобразование выполняется локально?
Да. Кодирование и декодирование происходят в вашем браузере. Вставленный текст никуда не загружается.