Ответ
XSS (Cross-Site Scripting) — это уязвимость веб-приложений, которая позволяет злоумышленнику внедрять и выполнять произвольный JavaScript-код в контексте браузера другого пользователя. Это происходит, когда приложение некорректно обрабатывает пользовательский ввод, вставляя его в выходной HTML-код без должной фильтрации или экранирования.
Основные типы XSS:
- Хранимый (Stored/Persistent): Вредоносный скрипт сохраняется на сервере (например, в базе данных, комментариях, профиле) и выполняется каждый раз при загрузке страницы.
- Отражённый (Reflected): Скрипт передаётся как часть запроса (часто в URL) и немедленно отражается в ответе сервера. Для эксплуатации требуется, чтобы пользователь перешёл по специально сформированной ссылке.
- DOM-based: Уязвимость существует исключительно в клиентском коде (JavaScript). Данные из источника, контролируемого злоумышленником (например,
document.location.hash), используются для динамического изменения DOM без безопасной обработки.
Пример уязвимого кода (PHP):
// Опасный код: пользовательский ввод выводится напрямую
echo '<div>Привет, ' . $_GET['username'] . '!</div>';
Если параметр запроса будет ?username=<script>stealCookies()</script>, скрипт выполнится в браузере жертвы.
Методы защиты:
- Экранирование (Output Encoding): Всегда экранируйте данные перед вставкой в HTML-контекст.
// Использование htmlspecialchars для экранирования HTML-сущностей echo '<div>Привет, ' . htmlspecialchars($_GET['username'], ENT_QUOTES | ENT_HTML5, 'UTF-8') . '!</div>'; - Content Security Policy (CSP): Используйте HTTP-заголовок
Content-Security-Policy, чтобы явно указать браузеру, откуда разрешена загрузка и выполнение скриптов, стилей и других ресурсов. Это эффективный барьер даже при успешной инъекции. - Валидация и санация ввода: Проверяйте и очищайте пользовательские данные на стороне сервера, используя белые списки разрешённых символов или форматов.
- HttpOnly флаг для кук: Устанавливайте флаг
HttpOnlyдля сессионных и других критичных кук, чтобы сделать их недоступными для JavaScript, что предотвратит их кражу через XSS.