Как ввести случайный одноразовый номер 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}}'"