ToolHub
View All Posts

Полное руководство по HTML-сущностям

HTML-сущности — один из самых фундаментальных, но часто неправильно понимаемых аспектов веб-разработки. Они являются механизмом, позволяющим браузерам отображать символы, которые в противном случае были бы интерпретированы как HTML-разметка, и играют критическую роль в веб-безопасности. Независимо от того, кодируете ли вы специальные символы для предотвращения атак межсайтового скриптинга, отображаете ли математические символы или обеспечиваете корректный рендеринг контента в разных кодировках, понимание HTML-сущностей необходимо каждому веб-разработчику.

Что такое HTML-сущности?

HTML-сущность — это последовательность символов, представляющая один символ в HTML. Сущность начинается с амперсанда (&) и заканчивается точкой с запятой (;). Когда браузер встречает сущность, он заменяет её соответствующим символом во время рендеринга. Этот механизм позволяет включать в HTML символы, которые иначе были бы невозможны или проблематичны.

<) начинает тег, знак больше (>) завершает тег, а амперсанд (&) начинает ссылку на сущность. Если вы хотите отобразить эти символы как видимый контент, а не как разметку, вы должны закодировать их как сущности.

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

Распространённые HTML-сущности

Хотя HTML определяет более 2 000 именованных сущностей, лишь некоторые из них часто используются в повседневной веб-разработке. Вот сущности, с которыми вы столкнётесь и будете использовать чаще всего:

Пять обязательных сущностей

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

Часто используемые символьные сущности

СимволИменованная сущностьОписание
Символ зарегистрированного товарного знакаСимвол товарного знакаТире (длинное тире)
Короткое тире (для диапазонов)Левая двойная угловая кавычкаПравая двойная угловая кавычка
Символ маркера спискаГоризонтальное многоточие (три точки) Registered trademark symbol
&trade; Trademark symbol
&mdash; Em dash (long dash)
&ndash; En dash (short dash, for ranges)
«&laquo; Left-pointing double angle quotation mark
»&raquo; Right-pointing double angle quotation mark
&bull; Bullet character
&hellip; Horizontal ellipsis (three dots)

Числовые и именованные сущности

HTML-сущности бывают двух форм: именованные и числовые. Понимание разницы помогает выбрать правильный тип в каждой ситуации.

Именованные сущности

< представляет знак меньше, а © — символ авторского права. Именованные сущности легче читать и запоминать, что делает ваш исходный HTML-код более удобным для сопровождения. Однако именованные сущности существуют только для ограниченного набора символов — около 2 000, в то время как в Unicode более 140 000 символов.

Числовые сущности

Числовые сущности ссылаются на символы по их кодовой позиции Unicode. Они бывают двух форм: десятичной и шестнадцатеричной. Десятичные числовые сущности используют формат &#NNN;, где NNN — десятичная кодовая позиция. Шестнадцатеричные сущности используют формат &#xHHH;, где HHH — шестнадцатеричная кодовая позиция. Например, символ авторского права можно записать как © (десятичный) или © (шестнадцатеричный).

Числовые сущности могут представлять любой символ Unicode, что делает их незаменимыми для символов, не имеющих именованных ссылок. Если вам нужно отобразить редкий CJK-символ, глиф исторической письменности или эмодзи без именованной сущности, вы должны использовать числовую форму.

Когда что использовать

Когда использовать HTML-сущности

Знать, когда использовать сущности, так же важно, как и знать, как их использовать. Вот основные сценарии, в которых сущности необходимы или полезны:

1. Отображение зарезервированных символов

<. Если вы напишете голый <, браузер попытается разобрать его как начало HTML-тега, что может сломать макет вашей страницы или создать уязвимость безопасности.

2. Предотвращение неоднозначности амперсанда

Амперсанд, за которым следует буква и точка с запятой, всегда интерпретируется как ссылка на сущность. Если в вашем контенте есть амперсанд, не являющийся частью сущности (например, в "Tom & Jerry"), вы должны закодировать его как &. Некодированный амперсанд, за которым следует текст, случайно совпадающий с именем сущности, будет декодирован неправильно. Например, некодированная строка "AT&T" может превратиться в "AT&T", если браузер интерпретирует &T как ссылку на сущность (хотя &T не является действительной сущностью, такое поведение технически некорректно).

3. Включение символов, отсутствующих на клавиатуре

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

4. Неразрывный пробел

Сущность   создаёт неразрывный пробел, который предотвращает разрыв строки браузером в этой позиции. Это важно для сохранения связанных слов на одной строке, например, "10 kg", "Глава 3" или названий брендов, которые не должны разделяться переносом строки. Она также часто используется для создания визуальных отступов в макетах, где CSS неуместен.

Влияние на безопасность: защита от XSS

Кодирование HTML-сущностей — одна из самых важных линий защиты от атак межсайтового скриптинга (XSS). XSS возникает, когда злоумышленник может внедрить исполняемый код в веб-страницу, просматриваемую другими пользователями. Кодирование сущностей предотвращает это, преобразуя опасные символы в их безопасные эквиваленты-сущности.

Как кодирование сущностей предотвращает XSS

и страница отображает это без кодирования, браузер выполнит скрипт. Однако если вывод закодирован сущностями, он становится <script>alert('xss')</script>, и браузер отображает это как буквальный текст, а не выполняет код.

Правила кодирования для конкретных контекстов

Кодирование сущностей работает в контексте HTML-контента и атрибутов, но разные контексты требуют разных стратегий кодирования: