XSS: типы и защита экранированием
XSS возникает, когда введённый текст попадает на страницу и браузер исполняет его как код.
XSS (Cross-Site Scripting) — межсайтовый скриптинг: внедрение чужого кода в страницу, который затем выполняется в браузере других пользователей в контексте сайта.
Это частный случай инъекции, но в контексте браузера. Если пользовательский текст выводится на страницу без обработки, символы разметки вроде < и > превращают данные в активный код. Мы разбираем механику концептуально и не приводим рабочих скриптов-атак.
Три типа XSS
| Тип | Где живёт |
| Stored (хранимый) | сохранён на сервере (комментарий, профиль) и бьёт по всем зрителям |
| Reflected (отражённый) | приходит в запросе и сразу отражается в ответе (поиск, параметр URL) |
| DOM-based | возникает в браузере: скрипт страницы небезопасно вставляет данные в DOM |
Почему опасно
Выполнившийся в браузере жертвы код действует от её имени: может прочитать доступные скрипту данные, отправить запросы, подменить содержимое страницы. Именно поэтому cookie сессии стоит помечать HttpOnly (см. A07) — чтобы скрипт до неё не дотянулся.
Защита: экранирование вывода
Главное правило — экранировать данные при выводе по контексту. Опасные символы заменяются на безопасные сущности, и браузер показывает их как текст, а не исполняет.
| Символ | Сущность |
| < | < |
| > | > |
| & | & |
| " | " |
Так строка с угловыми скобками отобразится как обычный текст:
<p>Пользователь написал: <script>...</script></p>Современные шаблонизаторы (например, во многих фреймворках) экранируют вывод автоматически — опасность появляется, когда разработчик это автоэкранирование отключает ради «вставки готового HTML».
Как защищаться
- Экранируйте весь вывод пользовательских данных по контексту (HTML, атрибут, URL, JS).
- Не отключайте автоэкранирование шаблонизатора без крайней необходимости.
- Если нужно разрешить часть HTML (форматирование), используйте проверенный санитайзер с белым списком тегов.
- Помечайте cookie сессии HttpOnly, чтобы скрипт не получил к ней доступ.
- Включайте Content Security Policy (об этом — следующий урок).
Частые ошибки разработчиков
- Вставляют пользовательский HTML «как есть» (raw), отключая автоэкранирование.
- Экранируют для одного контекста, забывая про другой (например, для HTML, но не для атрибута или URL).
- Пишут свой «фильтр тегов» вместо проверенного санитайзера — его легко обойти.
Итог
- XSS — исполнение чужого кода в браузере пользователя; бывает stored, reflected, DOM-based.
- Главная защита — экранирование вывода по контексту.
- Дополняют её санитайзер для разрешённого HTML, HttpOnly-cookie и CSP.