HTML-сутності: htmlspecialchars онлайн
Екранує текст для вставки в HTML і розкодовує сутності назад. Режим лапок як у ENT_QUOTES.
Показує, як текст має виглядати у шаблоні, щоб не стати XSS
Текст із форми з лапками й кутовими дужками треба показати на сторінці так, щоб браузер не виконав його як розмітку. Інструмент екранує рядок як htmlspecialchars з ENT_QUOTES і розкодовує сутності назад, коли треба прочитати, що насправді лежить у базі після подвійного екранування.
htmlspecialchars замінює & < > " ' на сутності & < > " '. Цього достатньо, щоб будь-який текст став безпечним усередині елемента чи атрибута. У Blade це робить {{ $text }}, у Twig автоекранування; сирий вивід {!! !!} чи |raw лише для HTML, який ви самі згенерували.
$comment = '<script>alert("xss")</script> & "лапки"';
echo htmlspecialchars($comment, ENT_QUOTES | ENT_HTML5, 'UTF-8');
// <script>alert("xss")</script> & "лапки"
echo html_entity_decode('<b>', ENT_QUOTES | ENT_HTML5, 'UTF-8');
// <b>
Що питають про цей інструмент
htmlspecialchars екранує лише пʼять символів, які мають значення в HTML: < > & і лапки. Цього достатньо для захисту від XSS, і саме її викликає {{ }} у Blade і Twig. htmlentities перетворює всі символи з іменованими сутностями, включно з кирилицею, що на UTF-8 сторінках лише роздуває розмітку.
Без нього одинарна лапка не екранується, а атрибути в HTML часто пишуть саме в одинарних. Тоді value='...' можна закрити зловмисним рядком. З PHP 8.1 ENT_QUOTES стоїть за замовчуванням, у старіших версіях його треба вказати явно.
Хтось екранував уже екранований рядок. Так буває, коли значення екранують при збереженні в базу, а потім ще й у шаблоні. Правило: зберігайте сирий текст, екрануйте на виході, один раз, у тому контексті, куди він іде.