CSP nonce — random value, генерируется per-request, включается в CSP header script-src 'nonce-XXX' и как атрибут <script nonce="XXX">. Позволяет выполнить конкретный inline script без 'unsafe-inline', что критично для XSS защиты. Особенно важно для React SSR + legacy code.
Ниже: пошаговая инструкция, рабочие примеры, типичные ошибки, FAQ.
$nonce = base64_encode(random_bytes(16));Content-Security-Policy: script-src 'self' 'nonce-<NONCE>' 'strict-dynamic'<script nonce="<NONCE>">doStuff()</script>__webpack_nonce__ + middleware| Сценарий | Конфиг |
|---|---|
| PHP middleware | $nonce = base64_encode(random_bytes(16));
header("Content-Security-Policy: script-src 'self' 'nonce-$nonce'"); |
| Next.js middleware | const nonce = Buffer.from(crypto.randomUUID()).toString('base64');
headers.set('Content-Security-Policy', `script-src 'self' 'nonce-${nonce}'`); |
| Inline script с nonce | <script nonce="<?= $nonce ?>">
window.dataLayer = [];
</script> |
| strict-dynamic (advanced) | script-src 'nonce-XXX' 'strict-dynamic'
# script-ы, загруженные через nonce-script, наследуют trust |
| Report-Only для тестирования | Content-Security-Policy-Report-Only: script-src 'self' 'nonce-XXX'; report-uri /csp-report |
strict-dynamic или hashNonce — для dynamic HTML (per-request). Hash — для статичного inline script (не меняется). На practice nonce + strict-dynamic = 95% случаев.
Директива CSP3: любой script, загруженный через nonce/hash-script, автоматически получает trust. Упрощает integration GTM/Analytics.
IE 11 поддерживает CSP 1 (basic). Nonce появился в CSP 2 — не работает в IE. На 2026 acceptable.
<a href="/csp">Enterno CSP Analyzer</a> → введите URL → grade + breakdown директив.