FlawOpen

flawopen.com/XSS/CSP vs. escape

CSP и экранирование вывода: нужны ли обе меры?

Справочная страница
Краткий ответ

Контекстное кодирование вывода помещает недоверенные значения в страницу как данные, а не как исполняемую разметку. Content Security Policy (CSP) — второй рубеж: как охранник, она проверяет, какие скрипты могут выполняться и куда им разрешено подключаться. Поэтому CSP может блокировать некоторые внедрённые действия при пропуске кодирования. Саму уязвимость она не исправляет, а слабая политика может не остановить скрипт.

Назначение каждой меры

Контекстное кодирование предотвращает внедрение

Кодируйте данные в точке попадания в контекст вывода. HTML-текст, атрибуты в кавычках, JavaScript, CSS и компоненты URL разбираются по разным правилам; нужный кодировщик зависит от точного контекста. Предпочитайте шаблоны фреймворка и безопасные DOM-sink, не помещайте недоверенные данные в исполняемые контексты, например inline-скрипты и обработчики событий. Это основная защита от XSS.

Применяемая CSP может ограничить некоторые внедрённые действия

Применяемая 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 используйте как дополнительный рубеж.

Частые вопросы

Как внедрить более строгую CSP?

Составьте список нужных скриптов и проверьте политику на основе nonce или hash без 'unsafe-inline' и 'unsafe-eval'. Content-Security-Policy-Report-Only помогает выявить конфликты, но не применяет политику. Изучите отчёты, настройте необходимые зависимости и затем включите применяемую Content-Security-Policy. Не отключайте контекстное кодирование на этапе внедрения.

Источники

См. также XSS (межсайтовый скриптинг, CWE-79): как он работает и как его предотвратить в любом языке — flawopen.com Безопасен ли dangerouslySetInnerHTML в React? Достаточно ли DOMPurify для безопасного innerHTML? Защищает ли Markdown от XSS? Защищает ли Svelte от XSS по умолчанию? Опасна ли загрузка SVG из-за XSS? Риск XSS при использовании Vue v-html