Глоссарий
Что такое XSS (Cross-Site Scripting) — код, выполняющийся в чужом браузере
XSS (Cross-Site Scripting) заставляет скрипт атакующего выполниться в браузере другого пользователя, что ведёт к краже сессии. Три типа (хранимый, отражённый, DOM) и реальная защита: экранирование на выводе, авто-экранирование фреймворка и CSP.
«Текст, который я ввёл в форму, выполняется как скрипт на чужом экране» — это и есть XSS. Вот как он работает и как его надёжно предотвратить (без шагов атаки).
Три типа
XSS делится по тому, «как вредоносная строка доходит до выполнения».
| Тип | Как подставляется |
|---|---|
| Хранимый | Сохраняется в посте/профиле и выполняется у каждого, кто его просматривает (самый опасный) |
| Отражённый | Параметр URL отражается прямо обратно в страницу; выполняется у того, кто кликает по ссылке |
| DOM-based | Без обращения к серверу — клиентский JS небезопасно обрабатывает ввод |
Почему это опасно (как работает)
Браузер выполняет любой <script> на странице как «легитимный код». Если строка атакующего попадает как HTML в страницу, браузер не может отличить её от настоящего кода.
Ущерб — «всё, что может эта страница». Если RCE — худшее на стороне сервера, то XSS — худшее на стороне клиента (пользователя).
Защита: реальное исправление — «экранировать на выводе»
XSS предотвращается на выводе, а не на вводе. В тот миг, когда вы выводите значение, преобразуйте его так, чтобы оно не могло быть интерпретировано как HTML.
Экранируйте на выводе (самое важное)
При выводе значений от пользователя преобразуйте < > & " ' в HTML-сущности — используя правильный метод для контекста (тело HTML, атрибут, JS, URL).
Не отключайте авто-экранирование вашего фреймворка
React/Vue/шаблоны авто-экранируют по умолчанию. Просто избегайте внедрения сырого HTML (dangerouslySetInnerHTML, v-html), и вы предотвратите большинство XSS.
Эшелонированная защита с CSP
Content-Security-Policy позволяет браузеру блокировать скрипты, которые вы не разрешали, ограничивая ущерб, даже если что-то проскользнёт.
Защитите cookie
Помечайте сессионные cookie HttpOnly, чтобы JS не мог их прочитать. Даже если их украдут, радиус поражения меньше.
Мнение этого сайта: лучшая защита — не открывать дыру самому
Современные фреймворки безопасны по умолчанию. Большинство XSS появляется в тот момент, когда разработчик намеренно отключает авто-экранирование, чтобы «внедрить сырой HTML». Если HTML действительно нужно разрешить, пропускайте его через проверенный временем санитайзер, а не через собственную обработку строк. «Отключение безопасности ради удобства» — самый большой риск.
Читать дальше
- Глоссарий: Что такое CSRF · Что такое RCE · Что такое JWT (токен, который часто крадут через XSS)
- Основы: Основы безопасности
FAQ
QЧто происходит при XSS?
Скрипт атакующего выполняется в браузере жертвы как часть настоящей страницы. Это может означать кражу сессии (вход под чужим именем), чтение ввода, дефейс страницы или автоматический запуск других действий.
QКакая защита от XSS главная?
Экранирование на выводе: когда вы выводите значения от пользователя, преобразуйте их так, чтобы они не интерпретировались как HTML. Шаблоны React/Vue делают это по умолчанию, поэтому самый большой выигрыш — не отключать это авто-экранирование (избегайте dangerouslySetInnerHTML и т. п.). Добавьте CSP для эшелонированной защиты.
QДостаточно ли санитизации на вводе?
Обычно нет. Реальное исправление — экранирование под контекст вывода (тело HTML, атрибут, JS, URL). Фильтры на вводе сами по себе протекают через несоответствие контекстов. Только когда HTML действительно нужно разрешить, пропускайте его через доверенный санитайзер.