【发布时间】:2017-08-05 18:37:14
【问题描述】:
我的 .htaccess 文件中有一个 Content-Security-Policy 标头,它适用于包含许多页面的整个网站。每个页面上都有我不(也不能)移动到单独的 .js 文件的内联元素,我希望 CSP 也允许它们而不使用“不安全内联”。因此,我想使用设置了 FALSE 标志的动态生成的 PHP header() 将它们添加到每个页面的顶部。 FALSE 标志(记录在here)将附加到任何现有的传入标头而不覆盖它。从理论上讲,这应该可以解决我的问题……但事实并非如此。
由于未知原因,我无法在我的 HTML 内容之前使用 PHP header() 附加或替换 .htaccess 文件中设置的 CSP。下面是演示问题的代码: (1) 页面的 .htaccess 文件; (2) PHP 页面本身。您应该能够轻松地重现这一点。 (我正在使用 Chrome 57 进行测试)。
sha256 散列适用于如下所示的元素;更改其中的一个字符,哈希将不再对其有效。 (如果您使用某些浏览器扩展,Chrome 可能会抱怨需要额外的哈希;只需将它们添加到 PHP header();方便地,Chrome 将为您提供 CSP 的每个内联 <script> 的正确哈希)
如果您移除 .htaccess 文件中的 CSP 指令,则脚本会执行。为了进一步证明它的工作,更改哈希中的一个字符并在控制台打开的情况下重新加载页面;它应该报告一个错误,指出 CSP 对脚本无效,然后报告应该使用什么哈希来验证(这将是原始哈希)。
但是,如果您随后取消 .htaccess 文件中的 CSP 指令,则 PHP header() 无效,无论是否带有 FALSE 标志。
这就是问题所在:当 .htaccess 文件有 CSP 头时,PHP CSP header() 不起作用。
我不想在 .htaccess 文件中使用 nonce 和 unsafe-inline 或 unsafe-eval...而且我不想将哈希添加到 .htaccess 文件中。 htaccess,因为这就是我试图绕过的。
我的猜测是 .htaccess 文件中需要一个额外的指令来激活 PHP CSP header()。对于既可以命名该指令又可以显示一种方法来包含附加 CSP 的任何人的奖励积分不是使用 PHP header(),而是使用<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>
【问题讨论】:
-
你找到答案了吗?我遇到了这个确切的问题,但在任何地方都没有答案......
标签: php apache .htaccess http-headers content-security-policy