apache — Как добавить / переопределить .htaccess Content-Security-Policy с помощью заголовка PHP CSP ()

У меня есть заголовок Content-Security-Policy в моем файле .htaccess, который подходит для всего сайта с большим количеством страниц. На каждой странице есть встроенные элементы, которые я не перемещаю (и не могу) перемещать в отдельные файлы .js, и я хочу, чтобы CSP также разрешил их использование БЕЗ использования unsafe-inline. Поэтому я хотел бы добавить их вверху каждой страницы, используя динамически генерируемый заголовок PHP () с установленным флагом FALSE. Флаг ЛОЖЬ (задокументировано Вот) добавит к любому существующему входящему заголовку, не перезаписывая его. Теоретически, это должно решить мою проблему … но это не так.

По неизвестным причинам я не могу ни добавить, ни заменить набор CSP в файле .htaccess с помощью заголовка PHP () перед моим содержимым HTML. Ниже приведен код, демонстрирующий проблему: (1) файл .htaccess для страницы; (2) сама страница PHP. Вы должны быть в состоянии воспроизвести это с легкостью. (Я использую Chrome 57 для тестирования).

Хэш sha256 предназначен для элемента, как показано ниже; измените один символ в нем, и хеш больше не будет действительным для него. (Если вы используете определенные расширения браузера, Chrome может жаловаться на необходимость дополнительных хэшей; просто добавьте их в заголовок PHP (); для удобства Chrome предоставит вам правильный хэш каждого встроенного элемента. <script> для CSP)

Если вы удалите директиву CSP в файле .htaccess, то скрипт выполнится. Чтобы доказать, что это работает, измените символ в хэше и перезагрузите страницу с открытой консолью; он должен сообщить об ошибке, сказав, что CSP недействителен для сценария, а затем сообщить, какой хеш-код следует использовать для проверки (который будет исходным хеш-кодом).

Но если вы затем удалите директиву CSP в файле .htaccess, то заголовок PHP () не будет работать ни с флагом FALSE, ни без него.

Это проблема: Заголовок PHP CSP () не действует, если файл .htaccess имеет заголовок CSP.

Я не хочу использовать nonce и я не хочу использовать unsafe-inline или же unsafe-eval в файле .htaccess … и я не хочу добавлять хеш к .htaccess, потому что это то, что я пытаюсь обойти.

Я предполагаю, что в файле .htaccess необходима дополнительная директива, которая позволит активировать заголовок PHP CSP (). Бонусные баллы для всех, кто может как назвать эту директиву, так и показать способ включить дополнительный CSP не с заголовком PHP (), а с <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'sha256-6eM329mc/AyToTIZuNqhbTD9GNw5jUJeTFszXn+hRU8='">, который я предпочел бы писать напрямую в HTML вместо использования заголовка PHP () (но решение в любом случае было бы хорошо).

Вот соответствующий код для воспроизведения этой проблемы:

.Htaccess:

# The CSP here is pared down for simplicity of illustration
<IfModule mod_headers.c>
Header set Content-Security-Policy "script-src 'self';"</IfModule>

Код PHP:

<?php
header("Content-Security-Policy: default-src 'self'; script-src 'self' 'sha256-6eM329mc/AyToTIZuNqhbTD9GNw5jUJeTFszXn+hRU8='", FALSE);
?>
<!DOCTYPE html>
<html>
<head>
<title>Content-Security-Policy test</title>
</head>
<body>
<p>"z = 231" should appear in the console</p>
<script>var test=function(){var x = 10.5;var y = 22;var z = x * y;console.log('z = ' + z);}; test();</script>
</body>
</html>

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …