CSP
Content Security Policy (W3C CSP3) — HTTP-заголовок или meta-тег, который говорит браузеру: откуда можно грузить скрипты, стили, шрифты, картинки, что можно исполнять inline и т.д. Основная защита от XSS.
Основные директивы
| Директива | Что регулирует |
|---|---|
default-src | фолбэк для всех остальных |
script-src | JS-файлы, inline <script> |
style-src | CSS, inline style |
img-src | картинки |
connect-src | fetch, XHR, WebSocket, EventSource |
font-src | шрифты |
frame-src | iframe (заменил child-src) |
frame-ancestors | кто может встроить нас в iframe (замена X-Frame-Options) |
form-action | куда можно сабмитить <form> |
base-uri | <base> тег |
upgrade-insecure-requests | принудительно http→https |
report-to, report-uri | куда слать нарушения |
Значения источников
'self'— тот же origin'none'— ничего'unsafe-inline'— разрешить inline (плохо для script)'unsafe-eval'— разрешить eval() (тоже плохо)'nonce-abc123'— только скрипты с matching nonce'sha256-...'— только скрипты с этим хешемhttps:,data:,blob:— схемы*.example.com— домены'strict-dynamic'— nonce-скрипт может загружать другие
Пример строгий
Content-Security-Policy:
default-src 'none';
script-src 'self' 'nonce-r4nd0m';
style-src 'self';
img-src 'self' data:;
connect-src 'self' https://api.example.com;
frame-ancestors 'none';
base-uri 'self';
form-action 'self';
report-to csp-endpoint
Report-Only режим
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
Нарушения логируются, но не блокируются. Для внедрения CSP без ломки.
Nonce vs hash vs 'unsafe-inline'
- nonce — рекомендуется, генерится на каждый запрос:
<script nonce="r4nd0m"> - hash — для статических inline-скриптов:
'sha256-hash' - 'unsafe-inline' — не используй, ломает CSP