Выбор ответа Junior Сессии и безопасность спрашивают часто обновлено

Защита от XSS при выводе

Вопрос

Пользовательское имя выводится в HTML-шаблоне на чистом PHP. Как правильно?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: htmlspecialchars($name, ENTQUOTES, 'UTF-8') при выводе. XSS лечится экранированием по контексту вывода: для HTML htmlspecialchars с ENTQUOTES (заодно защищает атрибуты в кавычках) и явной кодировкой.

Варианты ответа

  1. strip_tags($name) при сохранении в базу, вывод как есть
  2. Проверить, что в имени нет слова script и угловых скобок
  3. addslashes($name) при выводе, чтобы экранировать кавычки
  4. htmlspecialchars($name, ENT_QUOTES, 'UTF-8') при выводеправильный ответ

Разбор

XSS лечится экранированием по контексту вывода: для HTML htmlspecialchars с ENT_QUOTES (заодно защищает атрибуты в кавычках) и явной кодировкой. Шаблонизаторы Blade ({{ }}) и Twig экранируют автоматически. strip_tags при сохранении портит данные и не защищает атрибуты и JS-контекст. Чёрные списки слов обходятся. addslashes про другое.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.