CSP (Content Security Policy): что это и зачем нужен
CSP — HTTP-заголовок безопасности, запрещающий выполнение посторонних скриптов и загрузку ресурсов с чужих сайтов. Защищает от XSS-атак.
Что такое CSP
Content Security Policy (CSP) — HTTP-заголовок безопасности, который позволяет веб-сайту указать браузеру, с каких источников разрешено загружать ресурсы: скрипты, стили, изображения, шрифты, фреймы и др.
CSP — основная защита от XSS (Cross-Site Scripting) атак — одной из наиболее распространённых уязвимостей веб-приложений. Если злоумышленник внедрит вредоносный скрипт через форму или комментарий, CSP запретит браузеру его выполнить.
CSP поддерживается всеми современными браузерами. Внедрён в виде стандарта W3C.
Зачем нужен CSP
Защита от XSS: CSP блокирует выполнение inline-скриптов и скриптов с неразрешённых доменов.
Защита от clickjacking: директива frame-ancestors запрещает вставку сайта в iframe на чужих доменах.
Контроль загрузки ресурсов: предотвращает загрузку данных на сторонние серверы.
Отчётность: CSP умеет отправлять отчёты о нарушениях политики на ваш сервер.
SEO: Google учитывает безопасность сайта при ранжировании. CSP — часть общей безопасности.
Как настроить CSP
Базовая политика
Content-Security-Policy: default-src 'self'; script-src 'self' cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;
Основные директивы
default-src — источник по умолчанию для всех ресурсов:
default-src 'self'
script-src — источники JavaScript:
script-src 'self' https://cdn.example.com 'nonce-abc123'
style-src — источники CSS:
style-src 'self' https://fonts.googleapis.com 'unsafe-inline'
img-src — источники изображений:
img-src 'self' data: https://cdn.example.com
font-src — источники шрифтов:
font-src 'self' https://fonts.gstatic.com
frame-ancestors — кто может встраивать в iframe:
frame-ancestors 'none'
connect-src — источники для XHR, WebSocket, Fetch:
connect-src 'self' https://api.example.com
Значения источников
| Значение | Описание |
|----------|----------|
| 'self' | Только текущий домен |
| 'none' | Запрещено полностью |
| 'unsafe-inline' | Разрешить inline-скрипты/стили |
| 'unsafe-eval' | Разрешить eval() |
| https: | Любой HTTPS источник |
| https://example.com | Конкретный домен |
Nginx конфигурация
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'nonce-$request_id'; style-src 'self' 'unsafe-inline';" always;
Режим отчётов (без блокировки)
Для тестирования политики без блокировки ресурсов:
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
Проверка CSP на reChecker
Используйте CSP Analyzer для анализа политики безопасности. Инструмент покажет:
- Наличие заголовка CSP
- Список всех директив и их значений
- Потенциально опасные настройки (unsafe-inline, unsafe-eval)
- Рекомендации по ужесточению политики
FAQ
CSP ломает мой сайт — что делать?
Используйте режим Content-Security-Policy-Report-Only для тестирования без блокировки. Смотрите ошибки в консоли браузера и добавляйте нужные источники в политику постепенно.
Нужен ли CSP для статического сайта? Да, особенно если сайт принимает пользовательский ввод. Даже статические сайты через CDN могут подвергаться атакам через заражённые сторонние скрипты.
unsafe-inline — это плохо? Это ослабляет защиту CSP, так как разрешает inline-скрипты. Лучшая практика — использовать nonce (одноразовые токены) или hash для конкретных inline-блоков вместо глобального unsafe-inline.
Попробуйте инструмент
Проверьте csp (content security policy) на вашем сайте с помощью бесплатного инструмента.
CSP Analyzer →