Что такое 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;
Как защитить приложение:
-
Экранирование (Escaping) выводимых данных: Преобразовывать специальные символы HTML в их соответствующие сущности перед выводом данных на страницу.
&->&<-><>->>"->"'->'(или')
Большинство веб-фреймворков предоставляют встроенные функции для этого.
# Пример использования в Django шаблонах # Переменная user_input будет автоматически экранирована # при использовании {{ user_input }}# Пример использования в Flask с Jinja2 шаблонами # {{ user_input }} также экранирует по умолчанию -
Использование 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";
-
Санитизация (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> -
Защита от DOM-based XSS:
- Избегать использования
innerHTML,document.write,eval()с данными, поступающими из ненадежных источников (например,location.href,location.search). - Использовать безопасные API, которые по умолчанию обрабатывают данные как текст (например,
textContent).
// Безопаснее использовать textContent document.getElementById('output').textContent = document.location.href; - Избегать использования
Применяя комбинацию этих методов (экранирование на выходе, CSP, санитизация при необходимости), можно существенно снизить риск эксплуатации XSS-уязвимостей.