Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас

HTML-сутності

Екранувати HTML або повернути символи назад

Дані не залишають ваш браузер

Цей інструмент повністю працює на вашому пристрої: обчислення виконує JavaScript у вкладці. Ми не надсилаємо введений текст на сервер, не зберігаємо і не логуємо його. Можете сміливо працювати з робочими даними - і навіть відключити інтернет після завантаження сторінки.

Результат

Поділитись

Що таке HTML-сутності

Кілька символів мають в HTML власне значення: < відкриває тег, & починає сутність, лапки обмежують значення атрибута. Щоб показати їх як звичайний текст, їх замінюють на сутності - &lt;, &amp;, &quot;.

Це не косметика, а основа захисту від XSS. Якщо вставити в сторінку введений користувачем рядок <script>...</script> без екранування, браузер виконає його як код.

П'ять символів, які екранує PHP

htmlspecialchars('<a href="#">Тарас & Ко</a>');
// &lt;a href=&quot;#&quot;&gt;Тарас &amp; Ко&lt;/a&gt;

Це &, <, >, " і - з прапорцем ENT_QUOTES - '. Саме їх обробляє інструмент вище в режимі екранування.

// Сучасний PHP екранує обидва типи лапок за замовчуванням.
// У старому коді прапорець доводилося вказувати явно:
htmlspecialchars($input, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');

htmlentities() - інша функція: вона перетворює усі символи, які мають іменовану сутність, включно з кирилицею. У проєкті на UTF-8 вона не потрібна і лише роздуває розмір сторінки. Використовуйте htmlspecialchars().

У Blade це вже зроблено

{{-- Екранується автоматично - у 99% випадків потрібно саме це --}}
{{ $post->title }}

{{-- НЕ екранується: сирий HTML --}}
{!! $post->body !!}

{!! !!} - місце, де живуть XSS-вразливості. Якщо всередину потрапляє щось введене користувачем, HTML треба спершу почистити:

// Санітизація дозволяє безпечні теги і вирізає решту
{!! str($post->body)->markdown()->sanitizeHtml() !!}

Хелпер e() - це той самий htmlspecialchars() з правильними параметрами. Він знадобиться, коли ви збираєте HTML поза Blade:

$html = '<span title="' . e($userInput) . '">' . e($name) . '</span>';

Атрибути потребують окремої уваги

Екранування тексту і екранування атрибута - різні задачі. Значення атрибута обов'язково має бути в лапках, інакше пробіл у введенні дозволить дописати свій атрибут:

{{-- Небезпечно, якщо $class без лапок --}}
<div class={{ $class }}>

{{-- Правильно --}}
<div class="{{ $class }}">

А от у href навіть екранування не рятує від javascript: - URL треба перевіряти окремо, за схемою.