Content Security Policy (CSP) – это мощный механизм безопасности, позволяющий контролировать ресурсы, которые браузер может загружать для веб-страницы. Это помогает предотвратить XSS (Cross-Site Scripting) атаки и другие виды инъекций, определяя доверенные источники контента. CSP работает путем указания браузеру списка разрешенных источников для различных типов ресурсов.
Основные директивы CSP
CSP использует директивы для определения политики. Каждая директива определяет, какие источники разрешены для определенного типа ресурса. Вот некоторые из наиболее часто используемых директив:
- default-src: Устанавливает политику по умолчанию для всех типов ресурсов, для которых не указаны другие директивы.
- script-src: Определяет разрешенные источники для JavaScript. Например,
script-src 'self' https://example.comразрешает скрипты с текущего домена и с example.com. - style-src: Определяет разрешенные источники для CSS.
- img-src: Определяет разрешенные источники для изображений.
- font-src: Определяет разрешенные источники для шрифтов.
- connect-src: Определяет разрешенные источники для XMLHttpRequest (AJAX), WebSocket и EventSource.
- media-src: Определяет разрешенные источники для <audio> и <video> элементов.
- object-src: Определяет разрешенные источники для плагинов, таких как Flash.
- frame-src: Определяет разрешенные источники для <frame> и <iframe> элементов.
- report-uri: Указывает URL, на который браузер будет отправлять отчеты о нарушениях CSP.
- report-to: Более современный способ указания URL для отчетов, использующий Reporting API.
Примеры использования директив
Пример 1: Разрешение скриптов только с текущего домена
Content-Security-Policy: script-src 'self'
Эта политика разрешает загрузку JavaScript только с текущего домена. Попытка загрузить скрипт с другого домена будет заблокирована браузером.
Пример 2: Разрешение изображений с нескольких доменов
Content-Security-Policy: img-src 'self' https://example.com https://cdn.example.net
Эта политика разрешает загрузку изображений с текущего домена, example.com и cdn.example.net.
Пример 3: Использование nonce для скриптов
Content-Security-Policy: script-src 'nonce-12345'
Nonce – это случайная строка, которая генерируется на сервере и добавляется к тегу <script>. Эта политика разрешает загрузку только тех скриптов, которые содержат указанный nonce. Это полезно для inline скриптов.
Пример 4: Использование hash для скриптов
Content-Security-Policy: script-src 'sha256-YOUR_HASH_HERE'
Hash – это криптографическая хеш-функция, которая генерируется для содержимого скрипта. Эта политика разрешает загрузку только тех скриптов, которые имеют указанный hash. Это также полезно для inline скриптов.
Рекомендации по внедрению CSP
- Начните с report-only mode: Используйте директиву
Content-Security-Policy-Report-Only, чтобы сначала протестировать политику без блокировки ресурсов. Браузер будет отправлять отчеты о нарушениях, но не будет блокировать загрузку ресурсов. - Постепенно ужесточайте политику: Начните с более либеральной политики и постепенно ужесточайте ее, чтобы избежать поломки функциональности сайта.
- Используйте отчеты о нарушениях: Анализируйте отчеты о нарушениях, чтобы выявить проблемы и настроить политику.
- Будьте внимательны к inline скриптам и стилям: Inline скрипты и стили могут быть проблемой для CSP. Рассмотрите возможность переноса их в отдельные файлы.