flawopen.com/XSS/CSP vs. escape
CSP и экранирование вывода: нужны ли обе меры?
Контекстное кодирование вывода помещает недоверенные значения в страницу как данные, а не как исполняемую разметку. Content Security Policy (CSP) — второй рубеж: как охранник, она проверяет, какие скрипты могут выполняться и куда им разрешено подключаться. Поэтому CSP может блокировать некоторые внедрённые действия при пропуске кодирования. Саму уязвимость она не исправляет, а слабая политика может не остановить скрипт.
Назначение каждой меры
Кодируйте данные в точке попадания в контекст вывода. HTML-текст, атрибуты в кавычках, JavaScript, CSS и компоненты URL разбираются по разным правилам; нужный кодировщик зависит от точного контекста. Предпочитайте шаблоны фреймворка и безопасные DOM-sink, не помещайте недоверенные данные в исполняемые контексты, например inline-скрипты и обработчики событий. Это основная защита от XSS.
Применяемая Content-Security-Policy может ограничивать inline-скрипты, источники скриптов и направления соединений, например connect-src. При пропуске кодирования продуманная политика может заблокировать конкретный скрипт или соединение. Результат зависит от политики и браузера: CSP не гарантирует блокировку любого payload, утечки или script gadget; внедрение остаётся.
Почему CSP не заменяет кодирование вывода
Слишком разрешительная или неверно настроенная политика может оставить внедрение исполняемым. Разрешение 'unsafe-inline' ослабляет защиту от inline-скриптов; широкие списки хостов тоже могут разрешить источники скриптов. Директивы CSP решают разные задачи: ограничив script-src, нужно продуманно настроить connect-src для сетевых направлений. Заголовок Content-Security-Policy-Report-Only сообщает о нарушениях, но не блокирует их. Исправляйте внедрение кодированием, а CSP используйте как дополнительный рубеж.
Частые вопросы
Составьте список нужных скриптов и проверьте политику на основе nonce или hash без 'unsafe-inline' и 'unsafe-eval'. Content-Security-Policy-Report-Only помогает выявить конфликты, но не применяет политику. Изучите отчёты, настройте необходимые зависимости и затем включите применяемую Content-Security-Policy. Не отключайте контекстное кодирование на этапе внедрения.
Источники
- OWASP — руководство по Content Security Policy
- OWASP — предотвращение Cross-Site Scripting
- MDN — внедрение Content Security Policy
- W3C — Content Security Policy Level 3