Что такое уязвимость Cross-Site Scripting (XSS)

Ответ

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

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

  1. Отражённый (Reflected XSS): Вредоносный скрипт передаётся через URL или форму, и сервер сразу же "отражает" его в ответе пользователю. Скрипт не сохраняется на сервере.
  2. Хранимый (Stored/Persistent XSS): Атакующий сохраняет вредоносный скрипт в базе данных на сервере (например, в комментарии, профиле пользователя). Скрипт выполняется каждый раз, когда кто-то просматривает заражённую страницу.
  3. На основе 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, преобразуя спецсимволы (<, >, &, ") в их безопасные эквиваленты (&lt;, &gt;, &amp;, &quot;). Большинство шаблонизаторов (Jinja2, Django Templates) делают это по умолчанию.
  • Валидация ввода (Input Validation): Проверяйте и очищайте все входящие данные на соответствие ожидаемому формату.
  • Content Security Policy (CSP): Используйте HTTP-заголовок Content-Security-Policy для указания браузеру, из каких источников разрешено загружать и выполнять скрипты.