Глоссарий

Что такое XSS (Cross-Site Scripting): уязвимость, при которой скрипт атакующего выполняется в браузере другого пользователя

XSS выполняет скрипт атакующего в браузере другого пользователя и ведёт к краже сессии. Три типа XSS и основная защита: экранирование на выводе и CSP.

Опубликовано 2026-06-08 Обновлено 2026-10-06 6 мин чтения
На этой странице

XSS — это когда текст, введённый в форму, выполняется как скрипт на чужом экране. Вот как он работает и как его надёжно предотвратить (без шагов атаки).

Три типа

XSS делится по тому, «как вредоносная строка доходит до выполнения».

ТипКак подставляется
ХранимыйСохраняется в посте/профиле и выполняется у каждого, кто его просматривает (самый опасный)
ОтражённыйПараметр URL отражается прямо обратно в страницу; выполняется у того, кто кликает по ссылке
DOM-basedБез обращения к серверу — клиентский JS небезопасно обрабатывает ввод

Почему это опасно (как работает)

Браузер выполняет любой <script> на странице как «легитимный код». Если строка атакующего попадает как HTML в страницу, браузер не может отличить её от настоящего кода.

① Атакующий публикует «строку» (комментарий, имя, URL…)
↓ сервер выводит её без экранирования
② Строка подмешивается в страницу как HTML
↓ жертва открывает страницу
③ Код выполняется в браузере жертвы = кража сессии, выдача себя за неё
Выведите строку от пользователя «как есть», и браузер выполнит её как код.

Ущерб — «всё, что может эта страница». Если RCE — самая серьёзная уязвимость на стороне сервера, то XSS — самая серьёзная на стороне клиента (пользователя).

Защита: экранируйте на выводе

XSS предотвращается на выводе, а не на вводе. В тот миг, когда вы выводите значение, преобразуйте его так, чтобы оно не могло быть интерпретировано как HTML.

1

Экранируйте на выводе (самое важное)

При выводе значений от пользователя преобразуйте < > & " ' в HTML-сущности — используя правильный метод для контекста (тело HTML, атрибут, JS, URL).

2

Не отключайте авто-экранирование вашего фреймворка

React/Vue/шаблоны авто-экранируют по умолчанию. Просто избегайте внедрения сырого HTML (dangerouslySetInnerHTML, v-html), и вы предотвратите большинство XSS.

3

Эшелонированная защита с CSP

Content-Security-Policy позволяет браузеру блокировать скрипты, которые вы не разрешали, ограничивая ущерб, даже если что-то проскользнёт.

4

Защитите cookie

Помечайте сессионные cookie HttpOnly, чтобы JS не мог их прочитать. Даже если XSS проскользнёт, ущерб будет меньше.

Мнение этого сайта: лучшая защита — не отключать механизмы безопасности самому

Современные фреймворки безопасны по умолчанию. Большинство XSS появляется в тот момент, когда разработчик намеренно отключает авто-экранирование, чтобы «внедрить сырой HTML». Если HTML действительно нужно разрешить, пропускайте его через проверенный санитайзер, а не через собственную обработку строк. «Отключение безопасности ради удобства» — самый большой риск.

Чем XSS отличается от атак, с которыми его путают

XSS часто путают с CSRF из-за похожего названия и с SQL-инъекцией, где ввод тоже воспринимается как команда. Разница — в том, что выполняется и где.

АтакаЧто и где происходитОсновная защита
XSSСкрипт атакующего выполняется в браузере пользователя как часть настоящей страницыЭкранирование на выводе, CSP
CSRFСессия вошедшего пользователя используется для отправки запроса, которого он не хотел. Выполнять скрипт не нужноCSRF-токены, cookie SameSite
SQL-инъекцияВвод интерпретируется на сервере как часть SQL-запросаПлейсхолдеры
КликджекингНастоящая страница невидимо накладывается, и пользователь кликает по ней, не зная об этомCSP frame-ancestors

Учтите, что XSS обходит и защиту от CSRF. Как только скрипт выполняется внутри страницы, он может прочитать и CSRF-токен на этой странице (руководство OWASP по CSRF предупреждает о том же).

Реальный пример: XSS на экране, который открывают сотрудники

В 2026 году Instructure — компания, разрабатывающая систему управления обучением Canvas, — сообщила, что вторжение началось с XSS. По словам компании, атакующий с бесплатной учётной записи отправил обращение в поддержку с вредоносным кодом, а когда сотрудник поддержки открыл его, уязвимость XSS была использована для получения повышенных привилегий внутри Canvas (→ утечка данных Canvas (Instructure), на английском).

Урок в том, что XSS — проблема не только публичных страниц. Экраны поддержки, обратной связи и администрирования, где вашим сотрудникам показывается текст, присланный извне, рискованнее, потому что у учётных записей, которые их открывают, больше полномочий.

XSS по-прежнему среди самых распространённых слабостей. В «CWE Top 25» MITRE (25 самых опасных слабостей ПО), опубликованном в декабре 2025 года, XSS (CWE-79) занял первое место. В сентябре 2024 года американские CISA и ФБР также выпустили предупреждение с призывом к производителям ПО устранить XSS из своих продуктов.

Как проверить свой сайт

Пробовать строки атаки не нужно. Начните с этих четырёх проверок.

1

Найдите места, куда вставляется сырой HTML

Поищите в коде dangerouslySetInnerHTML, v-html, innerHTML и document.write и проверьте, может ли туда попасть значение от пользователя. Если может — выводите его как текст или пропускайте через проверенный санитайзер.

2

Проверьте, отправляется ли CSP

С помощью проверки заголовков безопасности посмотрите, есть ли Content-Security-Policy и что она разрешает. Разрешение 'unsafe-inline' сильно ослабляет её против XSS. Чтобы написать новую, составьте черновик в конструкторе CSP и сначала запустите её в режиме Report-Only (только сообщает о нарушениях).

3

Проверьте флаги сессионной cookie

В инструментах разработчика браузера (Application → Cookies) убедитесь, что у сессионной cookie есть HttpOnly и Secure. Флаги cookie проверяет и аудит сайта.

4

Не забудьте экраны администрирования и поддержки

Проверьте, что внутренние экраны, показывающие текст извне (тексты обращений, имена файлов, отображаемые имена), экранируются по тем же правилам, что и публичные страницы.

Источники (первичные)

  • OWASP, «Cross Site Scripting Prevention Cheat Sheet» — cheatsheetseries.owasp.org (экранирование под контекст вывода, безопасные настройки фреймворков по умолчанию)
  • MITRE, «2025 CWE Top 25 Most Dangerous Software Weaknesses» (декабрь 2025 г.) — cwe.mitre.org (CWE-79 на первом месте)
  • CISA и ФБР, «Secure by Design Alert: Eliminating Cross-Site Scripting Vulnerabilities» (17 сентября 2024 г.) — cisa.gov
  • OWASP, «Cross-Site Request Forgery Prevention Cheat Sheet» — cheatsheetseries.owasp.org (XSS может обойти защиту от CSRF)
  • IPA, «How to Secure Your Web Site» — ipa.go.jp (на японском)

Читать дальше

Классификация

CWE классифицирует типы слабостей, из-за которых возникают уязвимости; MITRE ATT&CK классифицирует техники атакующих. Обе системы ведёт MITRE, и они широко используются для разметки уязвимостей и правил обнаружения.

CWE™: Copyright © 2006–2026, The MITRE Corporation. CWE is a trademark of The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. Any copy you make for such purposes is authorized on the condition that you reproduce MITRE’s copyright designation and this license in any such copy. CWE Terms of Use

FAQ

QЧто происходит при XSS?
A

Скрипт атакующего выполняется в браузере жертвы как часть настоящей страницы. Это может означать кражу сессии (вход под чужим именем), чтение ввода, дефейс страницы или автоматический запуск других действий.

QКакая защита от XSS главная?
A

Экранирование на выводе: когда вы выводите значения от пользователя, преобразуйте их так, чтобы они не интерпретировались как HTML. Шаблоны React/Vue делают это по умолчанию, поэтому самый большой выигрыш — не отключать это авто-экранирование (избегайте dangerouslySetInnerHTML и т. п.). Добавьте CSP для эшелонированной защиты.

QДостаточно ли санитизации на вводе?
A

Обычно нет. Надёжная защита — экранирование под контекст вывода (тело HTML, атрибут, JS, URL). Фильтры на вводе сами по себе протекают через несоответствие контекстов. Только когда HTML действительно нужно разрешить, пропускайте его через доверенный санитайзер.

QПочему XSS, а не CSS?
A

Первые буквы Cross-Site Scripting — CSS, но это совпадает с CSS (Cascading Style Sheets) — языком оформления веб-страниц. Поэтому «Cross» записали как X, и стандартным сокращением стало XSS.

QЕсли я внедрил CSP, нужны ли другие меры против XSS?
A

Да. CSP (Content-Security-Policy) — второй слой, который ограничивает ущерб, если экранирование где-то пропущено. CSP, разрешающая 'unsafe-inline', во многом теряет ценность против XSS. Основой остаётся экранирование на выводе; CSP ставится поверх него.

QЕсли мои cookie помечены HttpOnly, о XSS можно не беспокоиться?
A

Это уменьшает ущерб, но не устраняет его. HttpOnly лишь не даёт скриптам прочитать cookie. Скрипт, выполняющийся через XSS, всё равно может отправлять запросы от имени пользователя изнутри страницы и читать всё, что страница показывает. HttpOnly ограничивает ущерб, но не предотвращает XSS.