flawopen.com/XSS/Типы XSS
Отражённый, хранимый и DOM-based XSS: в чём разница?
Отражённый, хранимый и DOM-based XSS описывают разные пути от недоверенных данных к небезопасному контексту браузера. Они могут пересекаться: выясните источник значения, сохраняется ли оно, какой код его выводит и каких пользователей оно достигает.
Три типа
Значение запроса попадает в ответ без кодирования для нужного контекста, и браузер интерпретирует его как разметку или сценарий. Злоумышленник может отправить жертве подготовленную ссылку, но основная ошибка — небезопасный вывод данных запроса. Исправляйте обработку в точке вывода.
Недоверенное содержимое сохраняется, а затем небезопасно отображается другим пользователям, например в комментарии или профиле. Каждый посетитель, открывший содержимое, может попасть в тот же небезопасный контекст, пока не исправлены сохранённое значение или путь вывода.
Клиентский JavaScript читает недоверенный источник (например, location.hash, параметр URL или данные сервера) и передаёт его в небезопасную точку DOM, такую как innerHTML. Значение может не попасть на сервер, но это не обязательно: DOM-based XSS описывает клиентский путь source-to-sink и может сочетаться с отражённой или хранимой доставкой. Исправляйте поток данных на клиенте.
Почему различие важно для исправления
Исправляйте XSS в точке вывода: применяйте кодирование для конкретного контекста или безопасный DOM API. Отражённый и хранимый XSS часто связан с серверным выводом, но небезопасная точка может возникнуть и при клиентском рендеринге. Для DOM-based XSS используйте textContent вместо innerHTML для текста; если нужен HTML, используйте поддерживаемый санитайзер с явной политикой. Серверное кодирование не заменяет проверку клиентских потоков source-to-sink.
Эти категории могут пересекаться
Отражённый и хранимый XSS описывают, как ввод попадает на страницу и сохраняется ли он. DOM-based описывает клиентский путь от источника к точке вывода. Категории не взаимоисключающие: сохранённый текст профиля, который клиентский код вставляет в innerHTML, может одновременно быть хранимым и DOM-based XSS.
DOM-based XSS: небезопасная точка вывода и текстовый режим
const value = new URLSearchParams(location.search).get("q") ?? "";
target.innerHTML = value;
const value = new URLSearchParams(location.search).get("q") ?? "";
target.textContent = value;
Источники
- OWASP XSS Prevention Cheat Sheet
- OWASP DOM-based XSS Prevention Cheat Sheet
- flawopen.com — Cross-Site Scripting