Загрузка...
Загрузка...
Нашли баг, сбой или ошибку в работе reChecker? Есть предложение по улучшению? Напишите нам, чтобы мы проверили и исправили проблему в сервисе.
Использование Content-Security-Policy-Report-Only для безопасного тестирования CSP. report-uri, Report API, сбор и анализ отчётов перед включением блокировки.
Быстрые определения и связанные понятия из SEO-глоссария reChecker.
CSP — HTTP-заголовок безопасности, запрещающий выполнение посторонних скриптов и загрузку ресурсов с чужих сайтов. Защищает от XSS-атак.
Читать в глоссарии →CDN (Content Delivery Network) — сеть серверов по всему миру для быстрой доставки контента пользователям. Снижает TTFB и ускоряет загрузку статики.
Читать в глоссарии →Минификация (minification) — удаление лишних символов из CSS, JS и HTML без изменения функциональности. Уменьшает размер файлов на 20-60%.
Читать в глоссарии →Плотность ключевых слов — процент вхождений ключевого слова в тексте относительно общего количества слов. Оптимальный уровень: 1-3% для основного запроса.
Читать в глоссарии →Полное руководство по настройке Brotli сжатия на веб-серверах: Nginx, Apache, сравнение с Gzip, уровни сжатия и проверка работы.
БезопасностьНастройка HTTP-кэширования: Cache-Control, ETag, Last-Modified, stale-while-revalidate. Стратегии для статики, HTML и API. Примеры для Nginx и Node.js.
БезопасностьНастройка безопасных cookies: Secure, HttpOnly, SameSite. Защита от XSS, CSRF, перехвата. Примеры для разных языков и фреймворков.
БезопасностьПолное руководство по CSP: все директивы, nonce, hash, report-uri, strict-dynamic. Пошаговое внедрение, отладка, примеры для популярных фреймворков.
Поделитесь с коллегами или изучите другие материалы блога
Включение 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();
});