Назад к вопросам
Middle
70
questionbank

Что такое XSS? Приведите примеры и расскажите, как защитить приложение от этой уязвимости.

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

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

  • Отраженная (Reflected) XSS: Вредоносный скрипт содержится в HTTP-запросе и "отражается" в ответе сервера без надлежащей санитизации.
    <!-- В ответ на запрос вида http://example.com/search?q=<script>alert('XSS!')</script> -->
    <p>Результаты поиска для: <script>alert('XSS!')</script></p>
    
  • Хранимая (Stored) XSS: Вредоносный скрипт сохраняется на сервере (например, в базе данных) и отображается на веб-странице при каждом просмотре другим пользователем.
    <!-- В сообщение на форуме или комментарий -->
    <p>Всем привет! <script>alert('XSS!')</script></p>
    
  • DOM-based XSS: Уязвимость возникает на стороне клиента, когда вредоносный скрипт модифицирует DOM веб-страницы. Источник уязвимости часто находится в клиентском JavaScript, обрабатывающем данные из URL (например, параметры запроса) без надлежащей санитизации.
    // Уязвимый код на стороне клиента
    // Если document.location.href содержит <script>alert('XSS!')</script>
    document.getElementById('output').innerHTML = document.location.href;
    

Как защитить приложение:

  1. Экранирование (Escaping) выводимых данных: Преобразовывать специальные символы HTML в их соответствующие сущности перед выводом данных на страницу.

    • & -> &amp;
    • < -> &lt;
    • > -> &gt;
    • " -> &quot;
    • ' -> &#39; (или &apos;)

    Большинство веб-фреймворков предоставляют встроенные функции для этого.

    # Пример использования в Django шаблонах
    # Переменная user_input будет автоматически экранирована
    # при использовании {{ user_input }}
    
    # Пример использования в Flask с Jinja2 шаблонами
    # {{ user_input }} также экранирует по умолчанию
    
  2. Использование HTTP-заголовков безопасности:

    • Content-Security-Policy (CSP): Определяет источники контента, разрешенного для загрузки и выполнения браузером.
      # Пример CSP заголовка в nginx
      add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://cdnjs.cloudflare.com;";
      
    • X-XSS-Protection: Устаревший, но все еще полезный заголовок для активации встроенного XSS-фильтра в некоторых браузерах. Рекомендуется использовать CSP вместо него.
      # Пример в nginx
      add_header X-XSS-Protection "1; mode=block";
      
  3. Санитизация (Sanitization) пользовательского ввода: Удаление или фильтрация потенциально опасных тегов и атрибутов из пользовательского ввода, особенно если разрешен ограниченный HTML (например, в текстовом редакторе). Использовать библиотеки для санитизации.

    # Пример использования Bleach для санитизации в Python
    import bleach
    
    user_input = '<script>alert("XSS!")</script><p>Hello</p>'
    safe_input = bleach.clean(user_input, tags=['p', 'a', 'strong'])
    print(safe_input)
    # Вывод: <p>Hello</p>
    
  4. Защита от DOM-based XSS:

    • Избегать использования innerHTML, document.write, eval() с данными, поступающими из ненадежных источников (например, location.href, location.search).
    • Использовать безопасные API, которые по умолчанию обрабатывают данные как текст (например, textContent).
    // Безопаснее использовать textContent
    document.getElementById('output').textContent = document.location.href;
    

Применяя комбинацию этих методов (экранирование на выходе, CSP, санитизация при необходимости), можно существенно снизить риск эксплуатации XSS-уязвимостей.