HTTPQUERY
Русский

Content-Security-Policy

Применение

Заголовок Content-Security-Policy (CSP) даёт администраторам сайта детальный контроль над загрузкой ресурсов. Объявляя политику, сервер указывает браузеру загружать скрипты, стили, изображения, шрифты и прочие ресурсы только из одобренных источников. Любой ресурс, не соответствующий политике, блокируется, а браузер сообщает о нарушении.

Политика состоит из одной или нескольких директив, разделённых точкой с запятой. Каждая директива называет тип ресурса и перечисляет источники, разрешённые для этого типа ресурса.

Content-Security-Policy: <directive> <source>; <directive>
  <source>

Распространённая практика — сначала развернуть новую политику в режиме «только отчёты». Заголовок Content-Security-Policy-Report-Only использует тот же синтаксис, но фиксирует нарушения в журнале, не блокируя ресурсы, что позволяет администраторам протестировать политику до её принудительного применения.

Директивы fetch

Директивы fetch управляют тем, откуда загружаются ресурсы определённых типов.

default-src

Директива default-src служит запасным вариантом для всех остальных директив fetch. Если конкретная директива fetch отсутствует, браузер откатывается к default-src.

Content-Security-Policy: default-src 'self'

script-src

Директива script-src ограничивает источники выполнения JavaScript. Списки разрешений на основе nonce и хешей обеспечивают более надёжную защиту, чем правила на основе хостов.

script-src-elem

Директива script-src-elem применяется именно к элементам

script-src-attr

Директива script-src-attr управляет встроенными обработчиками событий вроде onclick и onload, отдельно от загрузки элементов

style-src

Директива style-src задаёт допустимые источники CSS-таблиц стилей, включая встроенные стили и ссылки на внешние таблицы стилей.

style-src-elem

Директива style-src-elem применяется к элементам

style-src-attr

Директива style-src-attr управляет встроенными стилями, применяемыми напрямую к элементам DOM через атрибут style.

img-src

Директива img-src задаёт допустимые источники изображений и значков сайта.

connect-src

Директива connect-src ограничивает URL, доступные через программные интерфейсы, включая fetch(), XMLHttpRequest, WebSocket и EventSource.

font-src

Директива font-src задаёт допустимые источники шрифтов, загружаемых через @font-face.

frame-src

Директива frame-src задаёт допустимые источники вложенных контекстов просмотра, загружаемых элементами и

media-src

Директива media-src задаёт допустимые источники для элементов

object-src

Директива object-src ограничивает источники для элементов и ( — устаревший элемент, удалённый из спецификации HTML). Рекомендуется задавать ей значение ‘none’, поскольку эти элементы нужны крайне редко.

child-src

Директива child-src определяет разрешённые источники для веб-воркеров и вложенных контекстов просмотра. Более специфичные директивы frame-src и worker-src, если они присутствуют, переопределяют child-src.

worker-src

Директива worker-src применяется к скриптам Worker, SharedWorker и ServiceWorker.

manifest-src

Директива manifest-src задаёт допустимые источники файлов манифеста веб-приложения.

fenced-frame-src

Директива fenced-frame-src задаёт допустимые источники вложенных контекстов просмотра, загружаемых в элементы . При её отсутствии браузер откатывается к frame-src, а затем к default-src.

Директивы документа

Директивы документа управляют свойствами среды документа.

base-uri

Директива base-uri ограничивает URL, допустимые в элементе , не давая злоумышленникам подменить базовый URL для относительных ссылок.

sandbox

Директива sandbox накладывает на страницу ограничения, аналогичные атрибуту sandbox элемента

Директивы навигации

Директивы навигации управляют тем, куда пользователи и формы отправляют запросы.

form-action

Директива form-action ограничивает URL, допустимые в качестве целей отправки форм.

frame-ancestors

Директива frame-ancestors задаёт допустимых родителей, которым разрешено встраивать страницу с помощью ,

Директива navigate-to предлагалась для ограничения URL, на которые документу разрешено переходить любым механизмом. Эта директива была удалена из спецификации CSP Level 3 и никогда не поставлялась ни в одном браузере в рабочем окружении.

Директивы отчётности

Директивы отчётности управляют поведением при отправке отчётов о нарушениях.

report-to

Директива report-to задаёт имя группы отчётности, определённой заголовком Reporting-Endpoints. Отчёты о нарушениях отправляются на конечную точку, связанную с указанной группой.

report-uri

Директива report-uri отправляет отчёты о нарушениях на указанный URL. Эта директива постепенно заменяется на report-to, но по-прежнему широко применяется ради обратной совместимости.

upgrade-insecure-requests

Директива upgrade-insecure-requests предписывает браузеру рассматривать все HTTP-адреса на странице как HTTPS. Это особенно полезно при переходе с HTTP на HTTPS, когда многие ресурсы всё ещё ссылаются на небезопасные URL.

require-trusted-types-for

Директива require-trusted-types-for принудительно применяет политики Trusted Types к точкам внедрения DOM XSS, требуя типизированные объекты вместо строк.

trusted-types

Директива trusted-types задаёт список разрешённых имён политик Trusted Types, ограничивая набор политик, которые странице позволено создавать.

Значения источников

Директивы принимают выражения источников, определяющие, откуда загружаются ресурсы.

‘self’

Соответствует текущему источнику (та же схема, хост и порт). Поддомены не включаются.

‘none’

Блокирует все источники для данной директивы. Ресурсы указанного типа не загружаются вовсе.

‘unsafe-inline’

Разрешает встроенные элементы

‘unsafe-eval’

Разрешает динамическое вычисление кода через eval(), Function() и аналогичные конструкции.

‘unsafe-hashes’

Разрешает конкретные встроенные обработчики событий, определяемые по их хешу, не включая при этом все встроенные скрипты.

‘strict-dynamic’

Распространяет доверие на скрипты, загруженные уже доверенным скриптом. В сочетании с политиками на основе nonce это избавляет от необходимости вносить в список разрешений каждый хост со скриптами по отдельности.

‘nonce-*’

Криптографический nonce (число, используемое однократно), генерируемый сервером для каждого ответа. Значение nonce в политике совпадает с атрибутом nonce на элементах

Content-Security-Policy: script-src 'nonce-abc123'

‘sha256-’, ‘sha384-’, ‘sha512-*’

Хеш содержимого встроенного скрипта или стиля. Браузер вычисляет хеш каждого встроенного блока и сравнивает результат с хешами из списка разрешений.

host-source

Хост или шаблон URL, задающий разрешённые источники. Поддерживает подстановочные знаки для поддоменов (*.example.re), конкретные порты (example.re:443) и префиксы пути (example.re/scripts/).

scheme-source

Схема вроде https: или data:, разрешающая все ресурсы, отдаваемые по указанному протоколу.

‘report-sample’

Ключевое слово ‘report-sample’, добавленное к значению script-src или style-src, просит браузер включить в отчёт о нарушении короткий фрагмент нарушающего кода. Это помогает найти проблемный встроенный скрипт или стиль.

Пример

Строгая политика, разрешающая ресурсы только с того же источника, блокирует все встроенные скрипты и загрузку внешних ресурсов.

Content-Security-Policy: default-src 'self'

Политика с отдельными правилами для скриптов и изображений. Скрипты загружаются только с того же источника, а изображения — ещё и с выделенного CDN для изображений.

Content-Security-Policy: default-src 'self';
  img-src 'self' images.example.re

Политика для скриптов на основе nonce. При каждой загрузке страницы генерируется новый nonce, и выполняются только элементы

Content-Security-Policy: script-src 'nonce-r4nd0m';
  style-src 'self'

Политика, сочетающая ‘strict-dynamic’ с nonce. Доверенные скрипты могут свободно загружать дополнительные скрипты без внесения каждого хоста в список разрешений по отдельности.

Content-Security-Policy: script-src 'strict-dynamic'
  'nonce-r4nd0m'

Политика, которая применяет правила и одновременно отправляет отчёты о нарушениях на конечную точку для мониторинга.

Content-Security-Policy: default-src 'self';
  report-to csp-violations

Диагностика

Нарушения CSP появляются в консоли браузера в виде сообщений «Refused to…» с URI заблокированного ресурса и директивой, вызвавшей блокировку.

Встроенные скрипты блокируются после добавления CSP. Браузер выводит Refused to execute inline script because it violates the following Content Security Policy directive: “script-src …”. Политика по умолчанию блокирует все встроенные элементы

Встроенные стили блокируются. Консоль показывает Refused to apply inline style, когда style-src не содержит ‘unsafe-inline’ или совпадающего nonce/хеша. Это нарушение вызывают фреймворки, внедряющие стили во время выполнения. Добавьте nonce в style-src или используйте ‘unsafe-inline’ на время перехода к стилям на основе nonce.

Внешний ресурс заблокирован, потому что домен отсутствует в директиве. Ошибка Refused to load the script или Refused to connect означает, что источник ресурса не указан в соответствующей директиве. Откройте консоль браузера, определите заблокированный источник из сообщения о нарушении и добавьте этот источник в нужную директиву (script-src, img-src, connect-src и т. д.). Проверьте также default-src, поскольку отсутствующие директивы откатываются к значению по умолчанию.

eval() блокируется по умолчанию. Библиотеки, полагающиеся на eval(), new Function() или компиляторы шаблонов, вызывают ошибку Refused to evaluate a string as JavaScript. Добавление ‘unsafe-eval’ в script-src восстанавливает эту возможность, но ослабляет политику. По возможности предпочтительнее переработать код так, чтобы обойтись без eval().

Google Tag Manager или скрипты аналитики ломаются под CSP. Менеджеры тегов внедряют скрипты динамически, и каждому внедрённому скрипту нужен либо nonce, либо запись в списке разрешённых хостов. Добавьте домен GTM (https://www.googletagmanager.com) в script-src, а https://www.google-analytics.com — в connect-src и img-src. Для политик на основе nonce используйте ‘strict-dynamic’, чтобы скрипты, загруженные доверенным скриптом GTM, наследовали доверие без отдельных записей для каждого хоста.

Отладка нарушений в консоли браузера. Откройте DevTools и просмотрите вкладку Console на предмет сообщений о нарушениях CSP. Каждое сообщение называет заблокированный URI, нарушенную директиву и политику целиком. В Chrome вкладка Network помечает заблокированные запросы статусом (blocked:csp). Firefox даёт схожие подробности и в панели Console, и в панели Network.

Безопасное тестирование политики в режиме Report-Only. Сначала разверните политику с помощью заголовка Content-Security-Policy-Report-Only. Он фиксирует нарушения, не блокируя ресурсы. Следите за отчётами о нарушениях, исправьте недостающие источники и переключитесь на принудительный заголовок Content-Security-Policy, когда поток отчётов станет чистым.