Cross-Site Scripting (XSS) — это тип уязвимости веб-приложений, при которой злоумышленник может внедрить вредоносный скрипт в контент, отображаемый другим пользователям. XSS эксплуатирует доверие пользователя к сайту, позволяя выполнять произвольный JavaScript в контексте веб-страницы.
Существует три основных вида XSS:
Reflected XSS (Отражённый) Скрипт внедряется в запрос, например через URL или форму, и моментально возвращается сервером в ответ. Такой XSS активируется при переходе на специально подготовленную ссылку.
Stored XSS (Хранимый) Вредоносный код сохраняется на сервере — в базе данных, в комментариях, профилях пользователей и т.д. При открытии страницы этот код автоматически выполняется у всех посетителей.
DOM-based XSS (На стороне клиента) Скрипт
внедряется и выполняется полностью в браузере, чаще всего через
манипуляции с innerHTML, document.write,
eval или другими опасными методами DOM.
XSS работает за счёт внедрения HTML и JavaScript в контент страницы. Основные цели злоумышленника:
Пример отражённого XSS:
<form action="/search" method="GET">
<input type="text" name="query">
<button type="submit">Поиск</button>
</form>
Если сервер возвращает введённый текст без фильтрации:
<p>Результаты для: <?php echo $_GET['query']; ?></p>
Пользователь, перейдя по ссылке:
https://example.com/search?query=<script>alert('XSS')</script>
увидит выполнение JavaScript.
Основные источники XSS:
innerHTML и
document.write с пользовательскими данными. Эти
методы напрямую вставляют HTML и скрипты.function escapeHTML(str) {
return str.replace(/[&<>"']/g, function(match) {
return ({
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
})[match];
});
}
textContent, setAttribute,
appendChild безопаснее, чем innerHTML.const div = document.createElement('div');
div.textContent = userInput; // безопасно
document.body.appendChild(div);
Content-Security-Policy: default-src 'self'; script-src 'self';
Валидация на стороне сервера Проверка всех входных данных, фильтрация специальных символов, ограничение форматов (например, числа, email, даты).
Использование библиотек с защитой от XSS Современные фронтенд-фреймворки (React, Vue, Angular) по умолчанию экранируют данные в шаблонах. В чистом JavaScript требуется применять ручное экранирование.
<img src="x" oner ror="alert('XSS')" />
window.location = "jav * ascript:alert('XSS')";
eval(userInput); // крайне опасно
Любой из этих методов позволяет выполнять произвольный код и должен быть заменён безопасными альтернативами.
innerHTML,
eval, document.write.Эти практики создают многоуровневую защиту и снижают риск XSS-атак, делая приложение безопасным для пользователей и устойчивым к распространённым методам эксплуатации.