ToolDeck

HTML Escape / Unescape

Экранирование и декодирование HTML-сущностей (& < > " и др.)

Попробовать пример

Ввод

Вывод

Работает локально · Безопасно вставлять секреты
Результат появится здесь…

Что такое экранирование HTML?

Экранирование HTML — это процесс замены символов, имеющих специальное значение в HTML, соответствующими ссылками на сущности. Пять символов, которые необходимо экранировать: амперсанд (&), знак «меньше» (<), знак «больше» (>), двойные кавычки (") и одинарная кавычка ('). Без экранирования браузер интерпретирует эти символы как инструкции разметки, а не как отображаемый текст — это нарушает отображение страницы и открывает дверь для инъекционных атак.

Спецификация HTML (поддерживаемая WHATWG) определяет две формы ссылок на символы: именованные сущности, такие как &amp;, и числовые сущности, такие как &#38; или &#x26;. Именованные сущности удобнее читать в исходном коде. Числовые сущности (десятичные или шестнадцатеричные) могут представлять любую кодовую точку Unicode, что делает их полезными для символов без именованного псевдонима. Обе формы дают идентичный результат в браузере.

Декодирование (также называемое unescaping) — обратная операция: преобразование ссылок на сущности обратно в буквальные символы. Это распространено при извлечении текста из HTML-источника, переносе контента между системами или отладке шаблонов с двойным экранированием. Этот инструмент выполняет оба направления в браузере, так что вы можете проверить логику экранирования или восстановить обычный текст из насыщенного HTML-источника за секунды.

Зачем использовать инструмент HTML Escape?

Вручную заменять угловые скобки и амперсанды в больших блоках текста — утомительно и ненадёжно. Специализированный инструмент конвертирует ввод за один шаг без установки.

Мгновенное преобразование
Вставьте текст или HTML и сразу получите экранированный или декодированный вывод. Ожидание серверного запроса не требуется — вся обработка происходит локально в JavaScript.
🔒
Обработка без передачи данных
Ввод никогда не покидает браузер. Ничего не отправляется на сервер и нигде не сохраняется — вы можете безопасно экранировать разметку, содержащую учётные данные, API-ключи или внутренний код.
📋
Без аккаунта и установки
Откройте страницу и начните вставлять. Нет необходимости входить в систему, подтверждать почту или устанавливать программное обеспечение. Работает на любом устройстве с современным браузером.
🌐
Полное покрытие сущностей
Обрабатывает пять обязательных специальных символов HTML плюс числовые сущности (десятичные и шестнадцатеричные). Поддерживает двунаправленное преобразование: экранирование с последующим декодированием возвращает исходную строку.

Случаи использования HTML Escape

Фронтенд-разработчик: отображение пользовательского ввода
При отрисовке текста, введённого пользователем на странице, сначала экранируйте его, чтобы браузер не интерпретировал его как HTML-теги. Это основная защита от stored XSS в любом шаблоне, выводящем сырые строки.
Бэкенд-разработчик: генерация HTML-ответов
Серверный код, конкатенирующий строки в HTML, должен экранировать динамические значения перед вставкой. Используйте этот инструмент, чтобы убедиться, что ваша функция экранирования даёт корректный вывод для граничных случаев, таких как вложенные кавычки.
DevOps: встраивание конфигурации в HTML
Встраивание JSON или shell-команд в HTML-страницу (например, в теге script или атрибуте data) требует экранирования. Убедитесь, что угловые скобки и амперсанды в фрагментах конфигурации правильно закодированы.
QA-инженер: тестирование XSS-векторов
Вставьте распространённые XSS-нагрузки в инструмент, чтобы убедиться, что вывод вашего приложения совпадает с корректно экранированной версией. Сравните экранированный вывод посимвольно с тем, что производит ваше приложение.
Технический писатель: примеры кода в документации
Публикация фрагментов кода в HTML-документации (Jekyll, Hugo, кастомные CMS) требует экранирования угловых скобок для обобщённого синтаксиса типов и заполнителей шаблонов. Вставьте пример кода — и каждый специальный символ будет мгновенно закодирован.
Начинающий разработчик: изучение HTML-сущностей
Введите или вставьте любой символ и посмотрите его именованную и числовую формы сущности. Экспериментируйте с граничными случаями: неразрывные пробелы, длинные тире, символы Unicode — чтобы понять, как работает кодирование символов в HTML.

Таблица HTML-сущностей

В таблице ниже приведены часто используемые HTML-сущности. Пять специальных символов (& < > " ') всегда должны быть экранированы в содержимом HTML и значениях атрибутов. Остальные сущности необязательны, но полезны для символов, которые сложно набрать или которые неоднозначны в исходном коде.

СимволОписаниеИменованная сущностьЧисловая сущность
&Ampersand&amp;&#38;
<Less-than sign&lt;&#60;
>Greater-than sign&gt;&#62;
"Double quote&quot;&#34;
'Single quote / apostrophe&apos;&#39;
 Non-breaking space&nbsp;&#160;
©Copyright sign&copy;&#169;
®Registered sign&reg;&#174;
Em dash&mdash;&#8212;
Right single quote&rsquo;&#8217;
Euro sign&euro;&#8364;

Экранирование vs. Декодирование: когда что использовать

Две операции являются обратными друг другу. Выбор неправильного направления даёт двойное кодирование или незащищённый вывод.

Экранирование (кодирование)
Используйте при вставке ненадёжного или динамического текста в HTML. Преобразует буквальный < в &lt;, чтобы браузер отображал символ, а не начинал тег. Применяйте перед выводом пользовательского ввода, записей журналов или любой строки, которая может содержать разметку.
Декодирование (unescape)
Используйте при извлечении обычного текста из HTML-источника. Преобразует &lt; обратно в <. Применяйте при переносе контента из CMS, разборе scraped HTML или исправлении двойно закодированных строк вида &amp;amp;, которые отображают имена сущностей вместо символов.

Примеры кода

Ниже приведены рабочие примеры экранирования и декодирования HTML на четырёх языках. Каждый фрагмент охватывает оба направления и обрабатывает граничные случаи: вложенные кавычки и числовые сущности.

JavaScript (browser / Node.js)
// Escape HTML entities manually
function escapeHtml(str) {
  return str
    .replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&#39;')
}

escapeHtml('<img src="x" onerror="alert(1)">')
// → "&lt;img src=&quot;x&quot; onerror=&quot;alert(1)&quot;&gt;"

// Unescape using DOMParser (browser only)
function unescapeHtml(str) {
  const doc = new DOMParser().parseFromString(str, 'text/html')
  return doc.documentElement.textContent
}

unescapeHtml('&lt;div&gt;Hello&lt;/div&gt;')
// → "<div>Hello</div>"
Python
import html

# Escape special characters
html.escape('<script>alert("XSS")</script>')
# → '&lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;'

# Escape including single quotes (quote=True is default in Python 3.8+)
html.escape("It's <b>bold</b>", quote=True)
# → 'It&#x27;s &lt;b&gt;bold&lt;/b&gt;'

# Unescape entities back to characters
html.unescape('&lt;p&gt;Price: &euro;10&lt;/p&gt;')
# → '<p>Price: €10</p>'

# Unescape numeric entities
html.unescape('&#60;div&#62;&#38;amp;&#60;/div&#62;')
# → '<div>&amp;</div>'
Go
package main

import (
    "fmt"
    "html"
)

func main() {
    // Escape HTML special characters
    escaped := html.EscapeString(`<a href="page?id=1&sort=name">Link</a>`)
    fmt.Println(escaped)
    // → &lt;a href=&quot;page?id=1&amp;sort=name&quot;&gt;Link&lt;/a&gt;

    // Unescape back to original
    original := html.UnescapeString("&lt;b&gt;Go &amp; HTML&lt;/b&gt;")
    fmt.Println(original)
    // → <b>Go & HTML</b>
}
PHP
<?php
// Escape HTML entities (ENT_QUOTES escapes both " and ')
echo htmlspecialchars('<p class="info">Tom & Jerry's</p>', ENT_QUOTES, 'UTF-8');
// → &lt;p class=&quot;info&quot;&gt;Tom &amp; Jerry&#039;s&lt;/p&gt;

// Convert all applicable characters to HTML entities
echo htmlentities('Price: 10€ — 50% off', ENT_QUOTES, 'UTF-8');
// → Price: 10&euro; &mdash; 50% off

// Decode entities back
echo html_entity_decode('&lt;div&gt;&amp;copy; 2026&lt;/div&gt;');
// → <div>&copy; 2026</div>

Часто задаваемые вопросы

В чём разница между экранированием HTML и кодированием URL?
Экранирование HTML заменяет символы, специальные в HTML (< > & " '), ссылками на сущности вида &lt;, чтобы они отображались как текст. Кодирование URL (percent-encoding) заменяет символы, небезопасные в URL, последовательностями %XX в шестнадцатеричном формате. Они защищают разные контексты: экранирование HTML предотвращает инъекцию разметки, а кодирование URL обеспечивает корректные строки запроса и сегменты пути.
Какие символы необходимо экранировать в HTML?
Пять символов, которые необходимо всегда экранировать: & (амперсанд), < (знак «меньше»), > (знак «больше»), " (двойная кавычка внутри атрибутов), ' (одинарная кавычка внутри атрибутов). Неэкранирование любого из них может нарушить отрисовку или создать уязвимость межсайтового скриптинга.
Допустима ли сущность &apos; в HTML5?
Да. Именованная сущность &apos; определена в спецификации HTML5 и поддерживается всеми современными браузерами. В HTML 4 она отсутствовала — там признавались только &amp;, &lt;, &gt; и &quot;. Если нужна совместимость с очень старыми парсерами HTML 4, используйте числовую форму &#39;.
Как исправить двойное кодирование HTML-сущностей вида &amp;amp;?
Двойное кодирование возникает, когда уже экранированная строка снова проходит через функцию экранирования. Решение — декодировать до тех пор, пока вывод не стабилизируется. Вставьте двойно закодированную строку в этот инструмент в режиме декодирования, затем повторите, если ссылки на &amp; остались. Чтобы предотвратить двойное кодирование, проверьте, не экранирован ли ввод уже, прежде чем применять функцию экранирования.
Можно ли использовать HTML-сущности внутри строк JavaScript?
HTML-сущности интерпретируются HTML-парсером, а не движком JavaScript. Внутри блока script код выполняется после того, как HTML-парсер обработал страницу, поэтому &lt; в блоке script становится < до того, как JavaScript его увидит. Для встроенных обработчиков событий (onclick и др.) значение атрибута сначала декодируется HTML, а затем выполняется как JavaScript. Во внешних .js-файлах сущности не имеют специального значения и воспринимаются как буквальный текст.
В чём разница между htmlspecialchars и htmlentities в PHP?
htmlspecialchars() экранирует только пять специальных символов (& < > " '), влияющих на структуру HTML. htmlentities() экранирует эти пять плюс каждый символ, имеющий именованную HTML-сущность: знак копирайта, буквы с диакритическими знаками и т.д. В целях безопасности htmlspecialchars() с ENT_QUOTES достаточно. htmlentities() полезна, когда нужен ASCII-совместимый вывод для систем, не поддерживающих UTF-8.
Достаточно ли экранирования HTML для защиты от XSS?
Экранирование HTML предотвращает XSS в наиболее распространённом случае: вставка ненадёжного текста в содержимое HTML-элемента или значения атрибутов. Оно не защищает другие контексты инъекций. Вставка пользовательских данных в блок script требует экранирования строк JavaScript. Вставка в атрибут style требует CSS-экранирования. Вставка в атрибут URL (href, src) требует валидации URL плюс кодирования. Полноценная защита от XSS применяет контекстно-специфическое экранирование в каждой точке вставки.