Ответ
Cross-Site Scripting (XSS) — это тип уязвимости веб-приложений, который позволяет злоумышленнику внедрять вредоносный клиентский код (обычно JavaScript) на веб-страницы, просматриваемые другими пользователями. Цель — выполнить код в браузере жертвы для кражи данных (cookie, токены сессий), изменения содержимого страницы или перенаправления на фишинговые сайты.
Основные типы XSS:
- Отражённый (Reflected XSS): Вредоносный скрипт передаётся через URL или форму, и сервер сразу же "отражает" его в ответе пользователю. Скрипт не сохраняется на сервере.
- Хранимый (Stored/Persistent XSS): Атакующий сохраняет вредоносный скрипт в базе данных на сервере (например, в комментарии, профиле пользователя). Скрипт выполняется каждый раз, когда кто-то просматривает заражённую страницу.
- На основе DOM (DOM-based XSS): Уязвимость находится в клиентском коде, который манипулирует DOM-деревом страницы на основе пользовательского ввода без участия сервера.
Пример уязвимого кода (Python/Flask):
from flask import Flask, request
app = Flask(__name__)
# Уязвимый эндпоинт
@app.route('/search')
def search():
query = request.args.get('q', '')
# Прямой вывод пользовательского ввода без экранирования
return f"<h1>Результаты по запросу: {query}</h1>"
# URL для атаки:
# http://example.com/search?q=<script>alert('XSS Attack!')</script>
Основные методы защиты:
- Экранирование вывода (Output Escaping): Всегда обрабатывайте данные, выводимые в HTML, преобразуя спецсимволы (
<
,>
,&
,"
) в их безопасные эквиваленты (<
,>
,&
,"
). Большинство шаблонизаторов (Jinja2, Django Templates) делают это по умолчанию. - Валидация ввода (Input Validation): Проверяйте и очищайте все входящие данные на соответствие ожидаемому формату.
- Content Security Policy (CSP): Используйте HTTP-заголовок
Content-Security-Policy
для указания браузеру, из каких источников разрешено загружать и выполнять скрипты.