Генератор CSP — Content Security Policy с отмеченными подводными камнями
Генератор 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 и отчётность
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, внедрённый скрипт всё равно не загрузится, потому что его источника нет в списке.
что сама страница может делать (встраиваться, отправлять формы, разрешать относительные 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. Проверка заголовков безопасности на этом сайте оценивает весь набор.