Усі статті

HTML Entities: як безпечно виводити спецсимволи на сторінці

У HTML символи <, > та & мають спеціальне значення — вони позначають теги й початок entity. Якщо вивести їх на сторінці «як є», браузер спробує інтерпретувати їх як розмітку, і сторінка або зламається, або (гірше) виконає чужий код.

Іменовані та числові entity

HTML entity можна записати двома способами: іменованим кодом (&lt;, &amp;, &quot;) або числовим (&#60;, &#38;, або в шістнадцятковому вигляді &#x3C;). Обидва варіанти браузер відображає однаково — іменовані зазвичай легше читати, числові покривають будь-який символ Unicode, навіть без власної назви.

Мінімальний набір символів для екранування

  • <&lt; — щоб не почався тег.
  • >&gt; — щоб коректно закрити текст після тегу.
  • &&amp; — щоб амперсанд не сприймався як початок іншого entity.
  • " та '&quot;, &#39; — обов’язково всередині атрибутів у лапках.

Зв’язок із XSS

Більшість XSS-вразливостей виникають саме тому, що введений користувачем текст вставляють у HTML без екранування. Якщо текст «<script>...</script>» вивести без перетворення на entity, браузер виконає його як код. Екранування — базовий, хоч і не єдиний, захід захисту при виводі динамічного контенту.

Коли це потрібно

Кодування entity корисне при підготовці тексту для вставки в HTML вручну, налагодженні шаблонів, а декодування — щоб прочитати «сирий» текст із вже готової розмітки чи фіда даних.

Контекст має значення: текст проти атрибута

Екранування <, > і & достатньо для тексту між тегами, але всередині атрибута в лапках потрібно додатково екранувати саме той символ лапок, який використано — подвійні чи одинарні. Якщо атрибут обмежений подвійними лапками, а в значенні є незекранована подвійна лапка, розмітка «розірветься» раніше, ніж очікувалось, і частина значення потрапить у HTML як окремий атрибут.

Спробувати інструмент