Как ввести случайный одноразовый номер CSP в APACHE?

Я хочу добавить следующую директиву CSP в APACHE, потому что я хочу, чтобы она применялась на каждой странице.

<IfModule mod_headers.c>
    <FilesMatch "\.(htm|html|php)$">
        Content-Security-Policy: script-src 'strict-dynamic' 'nonce-{random}' 'unsafe-inline' ' https:;
    </FilesMatch>
</IfModule>

Я хотел бы также генерировать значение {random} непосредственно в APACHE (если это возможно).

Можно ли сгенерировать и вставить его непосредственно в директиву APACHE CSP? Или это плохая идея, я должен генерировать и вставлять на уровне приложения вместо (PHP)?

ПРИМЕЧАНИЕ. Я обнаружил, что создание одноразового номера в Apache 2.4 (для заголовка политики безопасности контента) выглядит многообещающе, но я не уверен, является ли $_SERVER[UNIQUE_ID] действительно случайным значением.

3 ответа

Одноразовый номер, который вы указали в заголовке CSP, должен совпадать с тегом сценария. Вот почему он обычно устанавливается на уровне приложения, где значение сохранения может использоваться в заголовке HTTP и в вашем HTML. Если вы установите его на уровне Apache, как вы будете использовать его в своем приложении?

@user3526609 заслуживает похвалы за это замечательное решение, но я хотел подвести итог, чтобы было понятно всем другим, вроде меня, которые повсюду искали это и нашли его в комментариях.

Короче говоря, вот как создать одноразовый номер CSP в.htaccessфайл, а не в веб-приложении, но при этом иметь возможность использовать его в веб-приложении.

Вы можете «сгенерировать» nonce с помощью Apache, повторно используя уникальный идентификатор, который он создает для каждого запроса. Создайте заголовок Content Security Policy следующим образом (многие другие важные биты исключены для краткости):

      Header always set Content-Security-Policy "\
  default-src 'self'; \
  script-src 'self' 'nonce-%{UNIQUE_ID}e';"

Обратите внимание, что обратная косая черта разбивает команду на хорошо читаемые строки, которые Apache позже удалит.

Это создает что-то вроде следующего:

'nonce-STRINGofRANDOMcharacters'

И PHP может получить к нему доступ следующим образом:

$_SERVER['UNIQUE_ID']

Пример на веб-странице:

      <script 
  src="https://www.google.com/recaptcha/api.js?render=your-site-key"
  nonce="<?php echo $_SERVER['UNIQUE_ID']; ?>">
</script>

В Apache у вас должен быть включен модуль mod_unique_id. Он генерирует уникальную переменную среды (UNIQUE_ID). Однако в его кодировке присутствуют недопустимые символы для csp [A-Za-z0-9@-] вместо обычного base64 [A-Za-z0-9+/].

Для генерации правильных значений необходимо использовать кодировку Base64. Это работает только в том случае, если Apache > 2.4 и выше. Например:

      Header set X-Nonce "expr=%{base64:%{reqenv:UNIQUE_ID}}"

Или для создания полной политики CSP выполните:

Header set Content-Security-Policy "expr=default-src 'self'; script-src 'self' 'nonce-%{base64:%{reqenv:UNIQUE_ID}}'"

Другие вопросы по тегам