HTML-сутності
Екранувати HTML або повернути символи назад
Дані не залишають ваш браузер
Цей інструмент повністю працює на вашому пристрої: обчислення виконує JavaScript у вкладці. Ми не надсилаємо введений текст на сервер, не зберігаємо і не логуємо його. Можете сміливо працювати з робочими даними - і навіть відключити інтернет після завантаження сторінки.
Що таке HTML-сутності
Кілька символів мають в HTML власне значення: < відкриває тег, & починає сутність, лапки обмежують значення атрибута. Щоб показати їх як звичайний текст, їх замінюють на сутності - <, &, ".
Це не косметика, а основа захисту від XSS. Якщо вставити в сторінку введений користувачем рядок <script>...</script> без екранування, браузер виконає його як код.
П'ять символів, які екранує PHP
htmlspecialchars('<a href="#">Тарас & Ко</a>');
// <a href="#">Тарас & Ко</a>
Це &, <, >, " і - з прапорцем 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 треба перевіряти окремо, за схемою.
- Де виконується
- у браузері
- Категорія
- Кодування