Как экранировать HTML или снять экранирование
- Выберите Экранировать или Снять экранирование.
- Для экранирования выберите в Экранировать, что именно экранировать:
- Только & < > " ‘: для HTML, который вы вставите в страницу или шаблон.
- Плюс все не-ASCII: для страниц, писем или систем, которые плохо дружат с UTF-8.
- Все символы: чтобы закодировать весь текст, например для проверки парсеров.
- Выберите Формат: Именованные (é), Десятичные (é) или Шестнадцатеричные (é). Для символов без общепринятого имени именованный формат переходит на десятичный. Снимите галочку Экранировать кавычки, если текст попадёт только в содержимое элемента.
- Нажмите Скопировать результат. Поменять местами переносит результат на другую сторону, чтобы проверить обратное преобразование.
Для снятия экранирования инструмент берёт HTML-парсер браузера и поэтому понимает все именованные ссылки HTML5 (их больше 2000), а также десятичные и шестнадцатеричные. Ввод никогда не отображается как HTML.
Частые сущности
| Символ | Именованная | Десятичная | Шестнадцатеричная |
|---|---|---|---|
& | & | & | & |
< | < | < | < |
> | > | > | > |
" | " | " | " |
' | ' (HTML5) | ' | ' |
| неразрывный пробел | |   |   |
é | é | é | é |
— | — | — | — |
€ | € | € | € |
© | © | © | © |
😀 | нет | 😀 | 😀 |
Числовые ссылки используют кодовую точку Unicode, а не байты UTF-8, поэтому эмодзи записывается одной ссылкой, а не четырьмя.
Подводные камни при экранировании и декодировании
- Сначала экранируйте
&. Если заменить<на<, а потом&на&, получится&lt;. Любой самописный экранировщик должен обрабатывать&раньше остальных. - Неэкранированный
&в тексте может превратиться в символ. HTML до сих пор распознаёт некоторые устаревшие сущности без точки с запятой, поэтому текст?id=1©=2¶=3отображается как?id=1©=2¶=3. Пишите&для каждого амперсанда, в URL тоже. - Двойное экранирование проявляется на странице как
&lt;b&gt;. Снимите экранирование один раз, а потом найдите, какой слой экранирует повторно. не пробел. Он декодируется в U+00A0, который выглядит как пробел, но в некоторых языках ломает сравнение строк иtrim().- Сущности не заменяют URL-кодирование. В ссылке
&разделяет параметры запроса в исходном HTML, а%26означает буквальный амперсанд внутри значения. Со вторым справится URL-кодировщик.
Экранирование и его снятие в коде
import html
html.escape('5 > 3 & "quotes"') # '5 > 3 & "quotes"'
html.unescape("Café — ©") # 'Café — ©'
const escapeHtml = s => s.replace(/&/g, "&").replace(/</g, "<")
.replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
const unescapeHtml = s =>
new DOMParser().parseFromString(s, "text/html").documentElement.textContent;
html.escape в Python по умолчанию экранирует кавычки и записывает ' как '. В PHP обычно используют htmlspecialchars(); начиная с PHP 8.1 она по умолчанию экранирует оба вида кавычек. DOMParser не выполняет скрипты в разобранном документе, поэтому это безопасный способ декодировать в браузере. Подробнее о работе со строками рассказывает страница про JavaScript.
Сущности, Base64 и data URI
HTML-сущности и Base64 решают разные задачи. Сущности делают символы безопасными внутри исходного HTML, а Base64 превращает байты в текст, чтобы целый файл поместился в атрибут. Чтобы встроить полный HTML-документ в URI data: или поле JSON, закодируйте его через HTML в Base64, а не экранируйте каждый символ.
Вопросы и ответы
Какие символы нужно экранировать в HTML?
В тексте нужно экранировать & и <, а по традиции и >. Внутри значений атрибутов добавляется кавычка, которой ограничено значение: " или '. Всё остальное, включая буквы с диакритикой и эмодзи, на странице в UTF-8 можно оставить как есть.
Чем ' отличается от '?
Оба означают апостроф. ' определён в HTML5 и XML, но отсутствовал в HTML 4, поэтому ' надёжнее: он работает в любом парсере и почтовом клиенте. Экранирование здесь использует '.
Почему на странице видно &amp;?
Текст экранировали дважды: & стал &, а второй проход превратил это в &amp;. Снимите экранирование здесь один раз, чтобы получить нужный текст, и уберите лишний шаг. Обычно это шаблонизатор, который экранирует уже экранированное значение.
Защищает ли экранирование HTML-сущностей от XSS?
Оно защищает от внедрения в текст HTML и значения атрибутов в кавычках. Внутри блоков <script>, URL javascript:, CSS и атрибутов без кавычек данные от этого безопасными не становятся: там нужно своё кодирование. Лучше полагайтесь на автоэкранирование шаблонизатора.