Строга CSP на великому сайті майже напевно щось зламає: інлайнові скрипти в шаблонах, onclick в атрибутах, сторонні віджети, аналітика, чат підтримки, стилі в атрибутах style. Вмикати її «одразу на продакшені» - ризиковано.
Режим лише звітування:
Content-Security-Policy-Report-Only: script-src 'nonce-...' 'strict-dynamic'; object-src 'none'; base-uri 'none'; report-to csp-endpoint
Reporting-Endpoints: csp-endpoint="https://example.com/csp-reports"
Браузер нічого не блокує, але відправляє звіт про кожне порушення: яка директива, яка адреса заблокувалася б, на якій сторінці. Старіший механізм - директива report-uri з адресою - досі широко підтримується, тож часто задають обидві.
Процес впровадження:
- Інвентаризація: які скрипти, стилі, фрейми,
fetch-ендпойнти реально використовуються (зокрема сторонніми сервісами). - Політика в режимі Report-Only на продакшені.
- Аналіз звітів - збирати в окремий ендпойнт чи сервіс (Sentry, Report URI). Відфільтрувати шум: розширення браузера генерують багато порушень (
chrome-extension://,moz-extension://), які до вашого коду не стосуються. - Виправлення коду: інлайнові обробники - у файли скриптів,
eval- прибрати, сторонні сервіси - додати до політики свідомо. - Перемикання на блокування (
Content-Security-Policy), а Report-Only лишити для наступної, суворішої версії політики.
Можна мати обидва заголовки одночасно: чинна політика блокує, а нова, суворіша, - лише звітує. Так політику посилюють поступово.
Що варто врахувати:
- ендпойнт звітів - публічний: обмеження частоти й розміру, без збереження довільних даних без перевірки (звіти може відправити будь-хто);
- звіти містять URL сторінок - у них можуть бути токени й персональні дані;
- CSP у
<meta>працює для більшості директив, але не підтримуєframe-ancestors,report-uri/report-toі режим Report-Only - для впровадження потрібен HTTP-заголовок; - різні політики для різних частин сайту (адмінка з багатьма віджетами й публічні сторінки) - нормальна практика.
Мета - не «щоб не було звітів», а щоб у script-src не лишилося 'unsafe-inline' і довгих переліків доменів.