Загрузка...
Загрузка...
Практическое руководство по настройке Content Security Policy для защиты от XSS. Директивы, примеры конфигурации, режим Report-Only и внедрение без поломки сайта.
Полное руководство по CSP: все директивы, nonce, hash, report-uri, strict-dynamic. Пошаговое внедрение, отладка, примеры для популярных фреймворков.
БезопасностьГлубокое руководство по настройке HTTP-заголовков безопасности. Content-Security-Policy, HSTS, X-Frame-Options и другие механизмы защиты от атак на веб-приложения.
БезопасностьИспользование Content-Security-Policy-Report-Only для безопасного тестирования CSP. report-uri, Report API, сбор и анализ отчётов перед включением блокировки.
БезопасностьНастройка безопасных cookies: Secure, HttpOnly, SameSite. Защита от XSS, CSRF, перехвата. Примеры для разных языков и фреймворков.
Поделитесь с коллегами или изучите другие материалы блога
Content Security Policy (CSP) — один из самых мощных механизмов защиты веб-приложений от атак межсайтового скриптинга (XSS). В отличие от фильтрации входных данных, CSP работает на уровне браузера: вы явно указываете, из каких источников разрешено загружать скрипты, стили, изображения и другие ресурсы. Любая попытка загрузить контент из неразрешённого источника блокируется до выполнения.
XSS-атаки остаются в топе уязвимостей OWASP. Злоумышленник может внедрить вредоносный скрипт через комментарии, формы обратной связи, параметры URL или уязвимости в сторонних библиотеках. CSP не устраняет уязвимость в коде, но предотвращает выполнение внедрённого скрипта — браузер просто откажется его загружать.
Дополнительно CSP защищает от:
Проверить текущую конфигурацию CSP и других заголовков безопасности можно с помощью анализатора заголовков безопасности и CSP-анализатора на rechecker.ru.
Директивы script-src и style-src контролируют источники JavaScript и CSS. Без явного указания 'unsafe-inline' inline-скрипты и стили блокируются.
Content-Security-Policy: script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'
| Ключевое слово | Описание |
|---|---|
'self' | Только с того же origin (схема + домен + порт) |
'none' | Запретить все источники |
'unsafe-inline' | Разрешить inline-скрипты/стили (снижает защиту) |
'unsafe-eval' | Разрешить eval(), new Function() (избегать) |
'strict-dynamic' | Скрипты, загруженные доверенным скриптом, считаются доверенными |
Директива по умолчанию для всех типов ресурсов, если конкретная директива не указана.
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com
img-src — источники изображенийfont-src — шрифты (Google Fonts, self-hosted)connect-src — XHR, fetch, WebSocket, EventSourceContent-Security-Policy: img-src 'self' data: https:; font-src 'self' https://fonts.gstatic.com; connect-src 'self' https://api.example.com
Контролирует, кто может встраивать страницу в iframe. Заменяет X-Frame-Options с расширенными возможностями.
Content-Security-Policy: frame-ancestors 'self' https://trusted-partner.com
Перед включением блокирующей политики используйте Content-Security-Policy-Report-Only. Браузер будет отправлять отчёты о нарушениях, но не блокировать контент. Подробнее о тестировании политики без блокировки — в статье CSP Report-Only: как тестировать политику без блокировки.
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
Современный вариант — report-to с Report API:
Content-Security-Policy-Report-Only: default-src 'self'; report-to csp-endpoint
Report-To: {"group":"csp-endpoint","max_age":10886400,"endpoints":[{"url":"/csp-report"}]}
Content-Security-Policy: default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'
Content-Security-Policy: default-src 'self'; script-src 'self' https://www.googletagmanager.com https://www.google.com https://www.gstatic.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: https:; connect-src 'self' https://www.google-analytics.com
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net; connect-src 'self' https://api.example.com wss://realtime.example.com; img-src 'self' data: https:; font-src 'self' https://cdn.jsdelivr.net
Вместо 'unsafe-inline' используйте nonce — одноразовый токен, генерируемый сервером для каждого запроса:
<script nonce="r4nd0mV4lu3">
// Этот скрипт выполнится, если nonce совпадает с CSP
console.log('Authorized inline script');
</script>
Content-Security-Policy: script-src 'self' 'nonce-r4nd0mV4lu3'
Альтернатива — hash: SHA-256 от содержимого скрипта. Подходит для статического контента.
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted-cdn.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;" always;
Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted-cdn.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;"
app.use((req, res, next) => {
res.setHeader(
'Content-Security-Policy',
"default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;"
);
next();
});
img-src 'self' https: — разрешает любые HTTPS-изображения. Укажите конкретные домены.'unsafe-inline' в script-src — сводит защиту от XSS к минимуму. Используйте nonce или hash.report-uri или report-to.Content-Security-Policy.Полное руководство по настройке CSP с учётом всех директив и edge cases — в материале Content Security Policy: полное руководство по настройке.