XSS (Cross-Site Scripting, межсайтовый скриптинг) — класс уязвимостей веб-приложений, при которых злоумышленник внедряет вредоносный JavaScript-код на страницы, просматриваемые другими пользователями. Входит в OWASP Top 10 на протяжении 20 лет.
Как работает XSS
Атака эксплуатирует доверие браузера к скриптам, загруженным с легитимного домена. Злоумышленник находит точку ввода данных — форму комментария, поисковую строку, URL-параметр — и добавляет тег <script> или обработчик события. Если приложение выводит эти данные без экранирования, браузер выполняет код в контексте целевого сайта.
Типы XSS
- Stored XSS (постоянный) — вредоносный код сохраняется в базе данных. Срабатывает при каждом просмотре заражённой страницы. Пример: скрипт в поле имени пользователя, отображаемом в заголовке сайта.
- Reflected XSS (отражённый) — код передаётся в URL или POST-параметрах и немедленно возвращается сервером без сохранения. Требует, чтобы жертва перешла по специально сформированной ссылке.
- DOM XSS — уязвимость в JavaScript на стороне клиента: скрипт читает URL-параметры или хеш и вставляет их в DOM без экранирования.
Последствия XSS-атаки
Похищение сессионных cookie (session hijacking), захват аккаунта без знания пароля, выполнение действий от имени жертвы, перенаправление на фишинговый сайт, запись нажатий клавиш (keylogging), распространение вредоносного ПО через drive-by download.
История
Термин XSS появился в 2000 году в бюллетене Microsoft. В 2005 году MySpace поразил червь Samy Kamkar — первый XSS-червь, добавивший автора в друзья 1 миллиону пользователей за 20 часов. В 2011 году XSS-уязвимость в Twitter распространяла ссылки при наведении курсора. Google, Facebook и другие крупные компании платят за найденные XSS-уязвимости тысячи долларов через bug bounty программы.
Защита от XSS
Многоуровневая защита:
- Экранирование вывода — HTML-encode всего пользовательского ввода перед выводом.
<→<,"→". В PHP:htmlspecialchars($input, ENT_QUOTES, 'UTF-8'). - Content Security Policy (CSP) — HTTP-заголовок, ограничивающий источники скриптов.
Content-Security-Policy: script-src 'self'запрещает инлайновые скрипты и внешние CDN без белого списка. - HttpOnly cookies —
Set-Cookie: session=...; HttpOnly; Secureзапрещает JavaScript читать сессионные cookie. - WAF — Web Application Firewall (Nginx ModSecurity, Cloudflare WAF) фильтрует XSS-паттерны на уровне запроса.
- Валидация на сервере — принимать только ожидаемые форматы данных. Поле «телефон» должно содержать только цифры и +.
На что обращать внимание
Фреймворки React, Vue, Angular автоматически экранируют вывод через Virtual DOM — основной вектор XSS закрыт. Опасные паттерны: innerHTML, dangerouslySetInnerHTML, document.write(), eval() — избегайте или используйте с санитизацией. SQL-инъекции и XSS часто присутствуют вместе — один аудит выявляет оба класса.
Для аудита XSS-уязвимостей используются инструменты: OWASP ZAP — бесплатный сканер с автоматическим поиском XSS в веб-приложении. Burp Suite — профессиональный инструмент пентестеров. Регулярный аудит кода на наличие innerHTML, document.write и небезопасных шаблонов — обязательная практика перед релизом. Связка XSS + SQL-инъекция позволяет злоумышленнику контролировать и интерфейс, и данные — такие уязвимости приоритетны для устранения. Правильная настройка CSP-заголовков в Nginx блокирует большинство XSS без изменений в коде приложения.
В PHP-приложениях используйте библиотеку HTML Purifier для санитизации HTML-разметки от пользователей — она разрешает только безопасные теги и атрибуты, удаляя потенциально опасные onclick и onload. В сочетании с CSP-заголовками и защитой от перебора через Nginx rate limiting это обеспечивает многоуровневую защиту приложения.