Content Security Policy (CSP) – это мощный механизм безопасности, который помогает защитить веб-приложения от различных видов атак, таких как Cross-Site Scripting (XSS), clickjacking и data injection. CSP позволяет администраторам веб-сайтов контролировать ресурсы, которые браузеру разрешено загружать для данного сайта. В этой статье мы рассмотрим, что такое CSP, как его настроить и какие директивы доступны.
Что такое Content Security Policy?
По умолчанию, браузеры довольно свободны в загрузке ресурсов (скрипты, стили, изображения и т.д.) с любого домена. Это может быть опасно, так как злоумышленник может внедрить вредоносный код на ваш сайт, и браузер его выполнит. CSP решает эту проблему, предоставляя возможность указать браузеру, какие источники ресурсов являются доверенными.
CSP работает путем отправки HTTP-заголовка Content-Security-Policy (или Content-Security-Policy-Report-Only для тестирования) вместе с ответом сервера. Этот заголовок содержит список директив, которые определяют политику безопасности для данного сайта.
Как настроить Content Security Policy?
Существует два основных способа настройки CSP:
- HTTP-заголовок: Это наиболее рекомендуемый способ. Вы добавляете заголовок 
Content-Security-Policyв конфигурацию вашего веб-сервера (например, Apache, Nginx). 
Пример настройки через HTTP-заголовок (Nginx):
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://trusted-cdn.com; style-src 'self' https://trusted-cdn.com; img-src 'self' data:; font-src 'self';";
Основные директивы Content Security Policy
CSP предоставляет множество директив для контроля различных типов ресурсов. Вот некоторые из наиболее важных:
default-src: Определяет политику по умолчанию для всех типов ресурсов, если не указана более конкретная директива.script-src: Определяет разрешенные источники для JavaScript-файлов.style-src: Определяет разрешенные источники для CSS-файлов.img-src: Определяет разрешенные источники для изображений.font-src: Определяет разрешенные источники для шрифтов.connect-src: Определяет разрешенные источники для запросов AJAX и WebSocket.object-src: Определяет разрешенные источники для плагинов (например, Flash).media-src: Определяет разрешенные источники для аудио- и видеофайлов.frame-src: Определяет разрешенные источники для iframe.report-uri: Указывает URL, на который браузер будет отправлять отчеты о нарушениях CSP.
Значения директив:
'self': Разрешает ресурсы с того же домена, что и текущая страница.'unsafe-inline': Разрешает inline-скрипты и стили (не рекомендуется использовать в production).'unsafe-eval': Разрешает использованиеeval(не рекомендуется использовать в production).data:: Разрешает ресурсы, закодированные в формате Data URI.https:: Разрешает ресурсы, загружаемые по протоколу HTTPS.*.example.com: Разрешает ресурсы с любого поддомена example.com.example.com: Разрешает ресурсы только с example.com.
Режим Report-Only и тестирование
Прежде чем применять CSP в production, рекомендуется протестировать его в режиме Report-Only. В этом режиме браузер не блокирует ресурсы, которые нарушают политику, а только отправляет отчеты о нарушениях на указанный URL (report-uri). Это позволяет вам выявить проблемы и настроить политику без прерывания работы сайта.
Для использования режима Report-Only, используйте заголовок Content-Security-Policy-Report-Only вместо Content-Security-Policy.
Content Security Policy – это важный инструмент для повышения безопасности веб-приложений. Настройка CSP может быть сложной задачей, но она того стоит. Начните с базовой политики и постепенно добавляйте более строгие ограничения, тестируя изменения в режиме Report-Only. Помните, что правильно настроенный CSP может значительно снизить риск XSS-атак и других угроз безопасности.