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 →