Загрузка...
Загрузка...
Использование Content-Security-Policy-Report-Only для безопасного тестирования CSP. report-uri, Report API, сбор и анализ отчётов перед включением блокировки.
Полное руководство по CSP: все директивы, nonce, hash, report-uri, strict-dynamic. Пошаговое внедрение, отладка, примеры для популярных фреймворков.
БезопасностьПрактическое руководство по настройке Content Security Policy для защиты от XSS. Директивы, примеры конфигурации, режим Report-Only и внедрение без поломки сайта.
БезопасностьГлубокое руководство по настройке HTTP-заголовков безопасности. Content-Security-Policy, HSTS, X-Frame-Options и другие механизмы защиты от атак на веб-приложения.
БезопасностьЧто такое хеш-функции, как работают MD5, SHA-1, SHA-256, SHA-512. Примеры использования, сравнение алгоритмов и онлайн-генератор хешей.
Поделитесь с коллегами или изучите другие материалы блога
Включение Content Security Policy на работающем сайте может сломать функциональность: скрипты аналитики, виджеты, inline-скрипты окажутся заблокированными. Режим Report-Only позволяет проверить политику без блокировки — браузер только отправляет отчёты о нарушениях.
Проверить текущую CSP и отладить политику можно с помощью CSP Analyzer на rechecker.ru.
Заголовок Content-Security-Policy-Report-Only действует так же, как Content-Security-Policy, но при нарушениях не блокирует ресурсы — только отправляет отчёт на указанный endpoint. Это даёт возможность:
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
Или с 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"}]}
| Параметр | report-uri | report-to |
|---|---|---|
| Статус | Устаревает (deprecated) | Рекомендуется |
| Формат | POST на URL | Report API |
| Поддержка | Широкая | Современные браузеры |
| Группировка | Нет | Да (группа endpoints) |
Для максимальной совместимости можно указать оба:
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report; report-to csp-endpoint
Report-To: {"group":"csp-endpoint","max_age":10886400,"endpoints":[{"url":"/csp-report"}]}
POST-запрос на report-uri с телом:
{
"csp-report": {
"document-uri": "https://example.com/page",
"referrer": "https://example.com/",
"violated-directive": "script-src",
"effective-directive": "script-src",
"blocked-uri": "https://evil.com/malicious.js",
"original-policy": "default-src 'self'; script-src 'self'",
"disposition": "report",
"status-code": 200,
"source-file": "https://example.com/page",
"line-number": 15,
"column-number": 10
}
}
Content-Type: application/csp-report
app.post('/csp-report', express.json({ type: 'application/csp-report' }), (req, res) => {
const report = req.body['csp-report'];
if (report) {
console.log('CSP violation:', {
document: report['document-uri'],
directive: report['violated-directive'],
blocked: report['blocked-uri'],
line: report['line-number'],
column: report['column-number']
});
// Сохранить в БД, отправить в Sentry и т.д.
}
res.status(204).end();
});
Nginx не обрабатывает POST-тело для CSP-отчётов. Нужен backend (Node, PHP, Python) или сервис вроде report-uri.com.
app.post('/csp-report', express.raw({ type: 'application/csp-report' }), (req, res) => {
fs.appendFileSync('csp-reports.log', JSON.stringify(req.body) + '\n');
res.status(204).end();
});
Включите максимально строгую политику, которую хотите достичь:
Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self'; connect-src 'self'; report-uri /csp-report
Соберите отчёты за 1–2 недели. Вы получите полный список нарушений.
Группируйте по:
violated-directive — какая директива нарушенаblocked-uri — какие источники нужно добавитьdocument-uri — на каких страницах проблемыДобавляйте легитимные источники в политику. Для inline-скриптов решайте:
Когда отчётов станет мало или они будут только от ботов/расширений — замените на Content-Security-Policy.
Можно иметь оба: блокирующую политику и Report-Only для мониторинга:
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.com
Content-Security-Policy-Report-Only: default-src 'none'; report-uri /csp-report
Report-Only с более строгой политикой покажет потенциальные нарушения, которые текущая политика ещё разрешает.
Sentry поддерживает CSP-отчёты. Настройте report-uri на endpoint Sentry или проксируйте отчёты:
app.post('/csp-report', express.json({ type: 'application/csp-report' }), (req, res) => {
const report = req.body['csp-report'];
if (report) {
Sentry.captureMessage('CSP violation', {
level: 'warning',
extra: report
});
}
res.status(204).end();
});