Что такое XSS (Cross-Site Scripting)?

«Что такое XSS (Cross-Site Scripting)?» — вопрос из категории Безопасность, который задают на 28% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Основные типы XSS:

  1. Хранимый (Stored/Persistent): Вредоносный скрипт сохраняется на сервере (например, в базе данных, комментариях, профиле) и выполняется каждый раз при загрузке страницы.
  2. Отражённый (Reflected): Скрипт передаётся как часть запроса (часто в URL) и немедленно отражается в ответе сервера. Для эксплуатации требуется, чтобы пользователь перешёл по специально сформированной ссылке.
  3. 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.