Генератор CSP

Отметьте директивы и источники, и эта страница соберёт корректный однострочный Content-Security-Policy для заголовка ответа или тега <meta> — а также важные примечания: какие директивы никогда не наследуют значение из default-src, когда хеш или nonce молча переопределяет unsafe-inline и что отключает strict-dynamic. Встроенный генератор хешей SHA-256/384/512 превращает встроенные скрипты и стили в источники 'sha256-…'. Всё работает в вашем браузере; ничего не загружается.
Неотмеченные директивы просто отсутствуют в политике; отметка без выбранных источников игнорируется. 'none' отменяет остальные флажки в своей строке. Поле дополнительных источников принимает список через запятую: имена хостов (cdn.example.com), схемы (https:), хеши и nonce с кавычками или без них.
директива 'self''none''unsafe-inline' 'unsafe-eval''strict-dynamic' data:blob: дополнительные источники
Эти четыре не наследуют значение из default-src: если их не указать, это означает «без ограничений», поэтому полная политика задаёт их явно.
директива'self''none'дополнительные источники

nonce для скриптов
report-uri
report-to
Пока ничего не собрано. Отметьте некоторые источники и нажмите Собрать политику или загрузите пример базовой политики OWASP.
Вставьте точное содержимое между <script> и </script> (или блок стиля) — байт в байт, без начального и конечного перевода строки — и выберите алгоритм. Результат — источник 'sha256-…', который ожидает CSP 3.
Здесь появится результат хеширования.
Развёртывайте как заголовок, а не как тег meta, когда это возможно. Заголовок ответа — это полная CSP: frame-ancestors, report-uri и report-to работают только там, а заголовок применяется до разбора первого байта HTML. Тег meta — запасной вариант для статических файлов без серверной настройки. Проверьте заголовки, которые ваш сайт действительно отправляет, в Проверке заголовков безопасности, а необработанные блоки ответов разберите в Парсере HTTP-заголовков.
Самопроверка
Повторно запускает конструктор на фиксированных состояниях: порядок источников, взаимное исключение 'none', строка базовой политики OWASP, кавычки для nonce и хешей, примечания об отсутствии наследования для base-uri / form-action / frame-ancestors, переопределение unsafe-inline через nonce или хеш, примечания strict-dynamic, имена заголовков Report-Only, исключения для тега meta, генератор хешей против независимо вычисленных векторов SHA и отрицательные пути. Ничего никуда не отправляется.
Что такое Content Security Policy?
Коротко: CSP — это белый список, который сервер отправляет вместе со страницей и который точно говорит браузеру, откуда можно загружать скрипты, стили, изображения и соединения — поэтому даже если злоумышленник внедрит HTML, внедрённый скрипт всё равно не загрузится, потому что его источника нет в списке.
Три группы директив
ГруппаПримерыЧто контролируетНаследует ли default-src?
Директивы загрузкиscript-src, style-src, img-src, connect-src, font-src, object-src, frame-src, worker-src, media-src, manifest-srcоткуда может загружаться каждый вид содержимогода — неотмеченная директива наследует default-src
Директивы документаbase-uri, form-action, frame-ancestors, sandboxчто сама страница может делать (встраиваться, отправлять формы, разрешать относительные URL)нет — каждая должна задаваться явно
Отчётность и прочееreport-uri, report-to, upgrade-insecure-requestsкуда отправляются отчёты о нарушениях и обновление устаревших URLнет (это не директивы загрузки)
Самые острые углы, по абзацу на каждый

'unsafe-inline' против хешей и nonce. Если директива содержит nonce или любой хеш-источник, CSP 3 говорит, что 'unsafe-inline' игнорируется — он остаётся только для очень старых браузеров. Поэтому фраза «мы добавили nonce и оставили unsafe-inline на всякий случай» на деле означает, что современные браузеры применяют nonce. Генератор помечает эту комбинацию, чтобы это было решением, а не случайностью.

strict-dynamic отключает ваш список разрешённых. Если в script-src есть strict-dynamic, хост-источники, схемы, 'self', 'unsafe-inline' и data: игнорируются для скриптов; значение имеют только nonce и хеши, а скрипты, которые они загружают, могут загружать дальнейшие скрипты. Это современный способ запускать загрузочные скрипты — но тогда остальной список script-src становится декоративным.

Теги meta — второго сорта. frame-ancestors, report-uri и report-to игнорируются в <meta http-equiv>. Генератор показывает, какие части вашей политики тихо не применятся.

Частые ошибки
  • Начинать с default-src * и длинного списка исключений. Работайте в обратном порядке: строгий default-src 'self', затем расширяйте только те директивы, которым это нужно. Узкие политики громко падают при тестировании; широкие — тихо падают навсегда.
  • Выкатить script-src 'unsafe-inline' 'unsafe-eval' и считать, что готово. Такая политика почти ничего не блокирует из того, что нужно атаке XSS. Задайте nonce или хеш вашим скриптам, добавьте strict-dynamic и держите report-only работающим в продакшене, чтобы ловить регрессии.
  • Забыть, что default-src покрывает не всё. У base-uri, form-action, frame-ancestors и sandbox нет наследования — самый часто упоминаемый пробел в реальных внедрениях CSP.
  • Тестировать сначала в режиме принуждения. Запустите в Report-Only с коллектором на неделю, прочитайте отчёты и только потом переключите на принуждение. Политика, которая ломает оформление заказа, хуже отсутствия политики.
  • Хешировать пробелы по-разному. Хеш покрывает точные байты встроенного блока; «полезный» шаг сборки, который обрезает завершающие переводы строк, меняет каждый хеш. Генерируйте хеши из того, что реально отправляется, а не из исходников.
Частые вопросы

Нужен ли default-src, если я перечисляю каждую директиву? Нет, но держать его как базовый уровень полезно: новые директивы загрузки в будущих браузерах будут наследовать ваш базовый уровень, а не «разрешено».

Что на самом деле делает upgrade-insecure-requests? Он велит браузеру переписать каждый URL http://, который загрузила бы страница — изображения, стили, запросы, — в https:// до отправки запроса. Это инструмент миграции; конечное состояние — страницы без единого URL http://.

Nonce или хеш? Nonce, когда вы контролируете ответ сервера (случайное значение на каждый ответ, и в заголовке, и в каждом теге скрипта). Хеш, когда HTML статичен или кешируется. Никогда статичный nonce — nonce, который не меняется, это просто unsafe-inline с дополнительными шагами.

Почему политика доставлена, а нарушения не приходят? Проверьте, не находитесь ли вы в Report-Only (только отчёты), указывает ли report-uri на коллектор, который принимает POST, и настроили ли вы также механизм Reporting-Endpoints / Report-To, который требует современная директива report-to.

Заменяет ли CSP другие защиты? Нет. Это один слой: продолжайте экранировать вывод, держите cookie под HttpOnly и Secure, держите HSTS. Проверка заголовков безопасности на этом сайте оценивает весь набор.