XSS: типы и защита экранированием

XSS возникает, когда введённый текст попадает на страницу и браузер исполняет его как код.

XSS (Cross-Site Scripting) — межсайтовый скриптинг: внедрение чужого кода в страницу, который затем выполняется в браузере других пользователей в контексте сайта.

Это частный случай инъекции, но в контексте браузера. Если пользовательский текст выводится на страницу без обработки, символы разметки вроде < и > превращают данные в активный код. Мы разбираем механику концептуально и не приводим рабочих скриптов-атак.

Три типа XSS

ТипГде живёт
Stored (хранимый)сохранён на сервере (комментарий, профиль) и бьёт по всем зрителям
Reflected (отражённый)приходит в запросе и сразу отражается в ответе (поиск, параметр URL)
DOM-basedвозникает в браузере: скрипт страницы небезопасно вставляет данные в DOM

Почему опасно

Выполнившийся в браузере жертвы код действует от её имени: может прочитать доступные скрипту данные, отправить запросы, подменить содержимое страницы. Именно поэтому cookie сессии стоит помечать HttpOnly (см. A07) — чтобы скрипт до неё не дотянулся.

Защита: экранирование вывода

Главное правило — экранировать данные при выводе по контексту. Опасные символы заменяются на безопасные сущности, и браузер показывает их как текст, а не исполняет.

СимволСущность
<&lt;
>&gt;
&&amp;
"&quot;

Так строка с угловыми скобками отобразится как обычный текст:

<p>Пользователь написал: &lt;script&gt;...&lt;/script&gt;</p>

Современные шаблонизаторы (например, во многих фреймворках) экранируют вывод автоматически — опасность появляется, когда разработчик это автоэкранирование отключает ради «вставки готового HTML».

Как защищаться

  • Экранируйте весь вывод пользовательских данных по контексту (HTML, атрибут, URL, JS).
  • Не отключайте автоэкранирование шаблонизатора без крайней необходимости.
  • Если нужно разрешить часть HTML (форматирование), используйте проверенный санитайзер с белым списком тегов.
  • Помечайте cookie сессии HttpOnly, чтобы скрипт не получил к ней доступ.
  • Включайте Content Security Policy (об этом — следующий урок).

Частые ошибки разработчиков

  • Вставляют пользовательский HTML «как есть» (raw), отключая автоэкранирование.
  • Экранируют для одного контекста, забывая про другой (например, для HTML, но не для атрибута или URL).
  • Пишут свой «фильтр тегов» вместо проверенного санитайзера — его легко обойти.

Итог

  • XSS — исполнение чужого кода в браузере пользователя; бывает stored, reflected, DOM-based.
  • Главная защита — экранирование вывода по контексту.
  • Дополняют её санитайзер для разрешённого HTML, HttpOnly-cookie и CSP.
Проверьте себя
1. Какой тип XSS сохраняется на сервере и бьёт по всем, кто откроет страницу?
AReflected
BStored (хранимый)
CDOM-based
DServer-side
2. Что является основной защитой от XSS?
AСкрыть форму ввода
BЭкранирование вывода пользовательских данных по контексту
CЗапрет cookie
DУвеличение тайм-аута сессии
3. Во что превращается символ < при HTML-экранировании?
AВ пробел
BВ &lt;
CВ удаление символа
DВ кавычку