Skip to content
EN

Как настроить Content-Security-Policy с nonce

Коротко:

Для защиты от XSS настройте CSP с nonce: (1) генерируйте nonce каждый запрос ($nonce = base64_encode(random_bytes(16))); (2) добавьте в заголовок script-src 'nonce-{$nonce}'; (3) проставьте атрибут nonce='{$nonce}' на каждый inline <script>. Без unsafe-inline.

Проверить свой сайт →

Пошаговая инструкция

  1. Сгенерируйте nonce в PHP. В начале шаблона: $nonce = base64_encode(random_bytes(16));. Обязательно новый nonce на каждый запрос.
  2. Добавьте CSP заголовок. В PHP: header("Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-{$nonce}'; style-src 'self' 'nonce-{$nonce}'; object-src 'none'; base-uri 'self'");
  3. Расставьте nonce на inline скрипты. <script nonce="<?= $nonce ?>">console.log('ok');</script>. Без nonce скрипт будет заблокирован.
  4. Проверьте через валидатор. Используйте /csp чекер Enterno.io. Grade A означает корректная настройка.
  5. Включите CSP-Report-Only параллельно. Для мониторинга: Content-Security-Policy-Report-Only: ...; report-uri /csp-report.php. Собирайте violations перед enforcing.

Открыть инструмент →

Что такое CSP и как настроить заголовки с nonce

Content Security Policy (CSP) — это механизм безопасности, который помогает предотвратить атаки типа XSS (межсайтовый скриптинг) и другие угрозы, связанные с внедрением контента. Настройка CSP с использованием nonce позволяет контролировать, какие скрипты могут выполняться на вашем сайте. Для настройки заголовков CSP с nonce, добавьте следующий заголовок в ответ сервера: Content-Security-Policy: script-src 'self' 'nonce-randomValue', где randomValue — это уникальное значение, генерируемое для каждой страницы.

Как правильно генерировать и использовать nonce

Nonce (число, используемое один раз) — это случайное значение, которое вы добавляете к вашим скриптам для их авторизации. Чтобы правильно использовать nonce, следуйте этим шагам:

  1. Генерируйте уникальное значение для каждого запроса на стороне сервера.
  2. Включите это значение в заголовок CSP, как описано ранее.
  3. Добавьте атрибут nonce к вашим тегам <script> на странице. Например: <script nonce='randomValue'>console.log("Hello, World!");</script>.

Таким образом, браузер будет выполнять только те скрипты, у которых совпадает значение nonce с указанным в заголовке CSP.

Практический пример настройки CSP с nonce

Рассмотрим практический пример настройки CSP с использованием nonce для веб-приложения на Node.js. Начнем с установки необходимых пакетов. Вам понадобится express и helmet для обеспечения безопасности:

npm install express helmet

После установки, создайте файл server.js и добавьте следующий код:

const express = require('express');
const helmet = require('helmet');
const app = express();

app.use(helmet());

app.get('/', (req, res) => {
    const nonce = Math.random().toString(36).substring(2, 15);
    res.setHeader("Content-Security-Policy", `script-src 'self' 'nonce-${nonce}'`);
    res.send(`Пример CSP`);
});

app.listen(3000, () => {
    console.log('Сервер запущен на http://localhost:3000');
});

В этом примере мы генерируем случайное значение nonce и добавляем его в заголовок CSP, а также в тег <script>. Теперь ваш сайт будет защищен от несанкционированного выполнения скриптов.

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

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

Нужна ли регистрация?

Нет для быстрой проверки. Для continuous-мониторинга — бесплатный аккаунт.

Запустить инструмент, который описан в этой статье

Бесплатный тариф — 10 мониторов, проверки каждые 5 мин, без карты. Платные тарифы — интервал от 1 минуты и проверки из нескольких регионов.