Skip to content

Как настроить CSP nonce

Коротко:

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.

Пошаговая настройка

  1. Сгенерируйте nonce per-request: $nonce = base64_encode(random_bytes(16));
  2. Установите CSP header: Content-Security-Policy: script-src 'self' 'nonce-<NONCE>' 'strict-dynamic'
  3. В HTML: <script nonce="<NONCE>">doStuff()</script>
  4. Всё остальное inline — заблокировано (как и должно быть против XSS)
  5. Для React/Next.js: через __webpack_nonce__ + middleware
  6. Проверьте: DevTools → Console → не должно быть "Refused to execute inline script"
  7. Enterno CSP Analyzer → grade = A

Рабочие примеры

СценарийКонфиг
PHP middleware$nonce = base64_encode(random_bytes(16)); header("Content-Security-Policy: script-src 'self' 'nonce-$nonce'");
Next.js middlewareconst 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

Типичные ошибки

  • Nonce не случайный (timestamp, sequential) — attacker может предугадать
  • Nonce используется > 1 request — полностью ломает безопасность
  • Забыть добавить nonce к legitimate inline script — блокирован, sign-in форма не работает
  • Google Analytics / GTM scripts не ожидают nonce — используйте strict-dynamic или hash
  • CSP header в HTML meta вместо HTTP header — не эффективен против XSS первой страницы

Больше по теме

Часто задаваемые вопросы

Nonce vs hash — что выбрать?

Nonce — для dynamic HTML (per-request). Hash — для статичного inline script (не меняется). На practice nonce + strict-dynamic = 95% случаев.

strict-dynamic — что это?

Директива CSP3: любой script, загруженный через nonce/hash-script, автоматически получает trust. Упрощает integration GTM/Analytics.

Работает ли CSP в IE?

IE 11 поддерживает CSP 1 (basic). Nonce появился в CSP 2 — не работает в IE. На 2026 acceptable.

Как проверить свой CSP?

<a href="/csp">Enterno CSP Analyzer</a> → введите URL → grade + breakdown директив.