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.
Бесплатный онлайн-инструмент — проверка CSP: результат мгновенно, без регистрации.
$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 или hashЧтобы настроить Content Security Policy (CSP) с использованием nonce и убрать директиву unsafe-inline, вам нужно добавить в HTTP-заголовок Content-Security-Policy параметр script-src с указанием nonce-{значение}. При этом каждое встроенное скриптовое содержимое должно иметь атрибут nonce с тем же значением. Это позволяет браузеру разрешать выполнение только тех скриптов, которые имеют правильный nonce, обеспечивая высокий уровень безопасности.
Content Security Policy (CSP) — это мощный механизм безопасности, который помогает предотвратить атаки типа XSS (межсайтовый скриптинг) путем ограничения источников контента, загружаемого на страницу. Использование nonce позволяет указать браузерам, какие скрипты могут быть выполнены, предотвращая выполнение вредоносного кода. Директива unsafe-inline позволяет выполнять встроенные скрипты, но это создает уязвимости. Убирая unsafe-inline и используя nonce, вы значительно повышаете безопасность вашего веб-приложения.
Nonce — это случайно сгенерированное значение, которое присваивается при каждом запросе. Это значение должно быть уникальным для каждого запроса, чтобы злоумышленники не могли его предугадать. Таким образом, даже если злоумышленник попытается внедрить свой собственный скрипт, он не сможет его выполнить, так как у него не будет правильного значения nonce.
Для настройки CSP с использованием nonce вам нужно внести изменения в конфигурацию сервера и HTML-код. Рассмотрим пример настройки на сервере Nginx.
server {
listen 80;
server_name example.com;
add_header Content-Security-Policy "script-src 'self' 'nonce-{nonce_value}';";
location / {
root /var/www/html;
index index.html;
}
}Здесь {nonce_value} — это случайное значение, которое вы должны генерировать для каждого запроса. Например, вы можете использовать PHP для генерации nonce:
<?php
$nonce = base64_encode(random_bytes(16));
header("Content-Security-Policy: script-src 'self' 'nonce-{$nonce}';");
?>В вашем HTML-коде вы должны добавить атрибут nonce к каждому встроенному скрипту:
<script nonce="{$nonce}">
console.log('Hello, world!');
</script>Не забудьте обновить значение nonce для каждого запроса, чтобы обеспечить максимальную безопасность. Таким образом, вы сможете избежать использования unsafe-inline и защитить ваше приложение от XSS-атак.
Nonce — для 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 директив.
Бесплатный тариф — 10 мониторов, проверки каждые 5 мин, без карты. Платные тарифы — интервал от 1 минуты и проверки из нескольких регионов.