У меня есть заголовок 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>
Задача ещё не решена.
Других решений пока нет …