У HTML символи <, > та & мають спеціальне значення — вони позначають теги й початок entity. Якщо вивести їх на сторінці «як є», браузер спробує інтерпретувати їх як розмітку, і сторінка або зламається, або (гірше) виконає чужий код.
Іменовані та числові entity
HTML entity можна записати двома способами: іменованим кодом (<, &, ") або числовим (<, &, або в шістнадцятковому вигляді <). Обидва варіанти браузер відображає однаково — іменовані зазвичай легше читати, числові покривають будь-який символ Unicode, навіть без власної назви.
Мінімальний набір символів для екранування
<→<— щоб не почався тег.>→>— щоб коректно закрити текст після тегу.&→&— щоб амперсанд не сприймався як початок іншого entity."та'→",'— обов’язково всередині атрибутів у лапках.
Зв’язок із XSS
Більшість XSS-вразливостей виникають саме тому, що введений користувачем текст вставляють у HTML без екранування. Якщо текст «<script>...</script>» вивести без перетворення на entity, браузер виконає його як код. Екранування — базовий, хоч і не єдиний, захід захисту при виводі динамічного контенту.
Коли це потрібно
Кодування entity корисне при підготовці тексту для вставки в HTML вручну, налагодженні шаблонів, а декодування — щоб прочитати «сирий» текст із вже готової розмітки чи фіда даних.
Контекст має значення: текст проти атрибута
Екранування <, > і & достатньо для тексту між тегами, але всередині атрибута в лапках потрібно додатково екранувати саме той символ лапок, який використано — подвійні чи одинарні. Якщо атрибут обмежений подвійними лапками, а в значенні є незекранована подвійна лапка, розмітка «розірветься» раніше, ніж очікувалось, і частина значення потрапить у HTML як окремий атрибут.