Открыть сервис

CSP

CSP (Content Security Policy, Политика безопасности контента) — это стандарт безопасности, используемый в веб-технологиях для предотвращения атак межсайтового скриптинга (XSS), внедрения данных и других видов инъекций кода. CSP представляет собой набор правил, которые веб-сервер передаёт браузеру через HTTP-заголовок Content-Security-Policy или мета-тег <meta (организация признана экстремистской, деятельность запрещена в РФ)>, определяя разрешённые источники загрузки контента (скриптов, стилей, изображений, шрифтов и т. д.) и ограничивая выполнение потенциально опасных операций.

История и развитие

CSP был разработан как ответ на рост числа атак, связанных с внедрением вредоносного кода в веб-страницы. Первая версия спецификации (CSP 1.0) была опубликована Консорциумом Всемирной паутины (W3C) в 2012 году. Она вводила базовые директивы для ограничения источников скриптов и стилей. В 2016 году вышла версия CSP 2.0, которая добавила поддержку встроенных скриптов через хэши и nonce (одноразовые токены), а также улучшила работу с отчётами о нарушениях. Текущая версия, CSP 3.0, находится в стадии разработки и включает расширенные возможности, такие как strict-dynamic и 'unsafe-hashes'.

Внедрение CSP активно поддерживается всеми современными браузерами, включая Google Chrome, Mozilla Firefox, Apple Safari и Microsoft Edge. Стандарт стал обязательным элементом безопасности для крупных веб-платформ, таких как Google, Facebook (организация признана экстремистской и запрещена в РФ), Twitter и многих государственных сайтов.

Принцип работы

CSP работает на основе белого списка: администратор веб-сайта определяет, какие источники контента считаются доверенными, а браузер блокирует загрузку или выполнение всего, что не соответствует этим правилам. Политика передаётся в виде строки, содержащей директивы и их значения. Например, заголовок Content-Security-Policy: default-src 'self'; script-src 'self' https://apis.example.com` разрешает загрузку скриптов только с собственного домена и указанного внешнего источника.

Браузер проверяет каждый запрос на соответствие политике. Если ресурс не разрешён, он блокируется, а в консоль разработчика выводится сообщение об ошибке. При включении режима отчётов (report-uri или report-to) браузер отправляет данные о нарушениях на указанный сервер, что позволяет администратору выявлять проблемы.

Основные директивы

CSP включает множество директив, каждая из которых управляет определённым типом контента. Ниже приведены ключевые из них:

  • default-src — задаёт политику по умолчанию для всех типов ресурсов, если для них не указана отдельная директива.
  • script-src — определяет разрешённые источники для JavaScript-скриптов. Может включать значения 'self', 'unsafe-inline', 'unsafe-eval', 'nonce-<base64>', '<hash>' и URL.
  • style-src — управляет загрузкой CSS-стилей.
  • img-src — ограничивает источники изображений.
  • connect-src — контролирует, к каким URL можно отправлять запросы (например, через fetch или XMLHttpRequest).
  • frame-src и child-src — регулируют встраивание фреймов и других вложенных документов.
  • font-src — разрешает загрузку шрифтов.
  • object-src — управляет плагинами (например, Flash или Java).
  • report-uri и report-to — указывают адрес для отправки отчётов о нарушениях.
  • upgrade-insecure-requests — автоматически заменяет HTTP-ссылки на HTTPS.
  • block-all-mixed-content — блокирует смешанный контент (HTTP-ресурсы на HTTPS-страницах).

Режимы работы

CSP может работать в двух основных режимах:

Режим блокировки

В этом режиме браузер строго соблюдает политику и блокирует любой контент, не соответствующий правилам. Это наиболее безопасный вариант, но он может привести к поломке сайта, если политика настроена некорректно.

Режим отчётов (Content-Security-Policy-Report-Only)

В этом режиме политика не блокирует контент, а только отправляет отчёты о нарушениях. Это позволяет разработчикам тестировать политику без риска нарушить работу сайта. Заголовок для этого режима — Content-Security-Policy-Report-Only.

Применение

CSP широко используется для защиты веб-приложений от XSS-атак, которые являются одной из наиболее распространённых угроз в интернете. Основные области применения:

  • Защита от инъекций скриптов — блокировка выполнения скриптов, внедрённых через уязвимости ввода данных (например, в комментариях или формах).
  • Предотвращение кражи данных — ограничение источников, с которых можно загружать контент, затрудняет атаки типа data exfiltration.
  • Контроль встраивания контента — запрет на загрузку ресурсов с непроверенных доменов снижает риск фишинга и вредоносной рекламы.
  • Обеспечение HTTPS — директива upgrade-insecure-requests принудительно переводит все запросы на защищённый протокол.

Примеры настройки

Ниже приведены примеры типичных политик CSP:

Простая политика для статического сайта

`` Content-Security-Policy: default-src 'self' `` Разрешает загрузку всех ресурсов только с собственного домена.

Политика для сайта с внешними скриптами и стилями

`` Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline' `` Разрешает скрипты с собственного домена и CDN, а стили — с собственного домена и встроенные.

Политика с nonce для динамических скриптов

`` Content-Security-Policy: script-src 'nonce-abc123' ` Разрешает выполнение только скриптов, содержащих атрибут nonce="abc123"`.

Критика и ограничения

Несмотря на эффективность, CSP имеет ряд ограничений и критикуется за сложность настройки. Основные проблемы:

  • Сложность конфигурации — для крупных сайтов с множеством внешних ресурсов (виджеты, аналитика, реклама) составление корректной политики требует значительных усилий. Часто разработчики используют слишком разрешительные политики (например, 'unsafe-inline'), что снижает защиту.
  • Совместимость с устаревшими браузерами — старые версии браузеров (например, Internet Explorer) не поддерживают CSP или поддерживают его частично.
  • Ложные срабатывания — блокировка легитимного контента может нарушить работу сайта, особенно при использовании динамических скриптов или сторонних сервисов.
  • Обходные пути — некоторые атаки, такие как DOM-based XSS, могут быть не полностью заблокированы CSP, если политика разрешает 'unsafe-eval' или встроенные скрипты.

Интересные факты

  • CSP может использоваться не только для защиты от XSS, но и для предотвращения clickjacking (атаки с помощью невидимых фреймов) через директиву frame-ancestors.
  • В 2020 году Google Chrome начал требовать CSP для всех расширений браузера, чтобы ограничить их доступ к данным пользователей.
  • Некоторые крупные сервисы, такие как GitHub и Dropbox, публикуют свои политики CSP в открытом доступе, чтобы разработчики могли их изучать.

Источники

  • W3C. Content Security Policy Level 3. Working Draft.
  • Mozilla Developer Network. Content Security Policy (CSP).
  • OWASP. Content Security Policy Cheat Sheet.
  • Google Developers. Web Fundamentals: Content Security Policy.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →