Tom*_*Tom 5 php apache .htaccess http-headers content-security-policy
我的 .htaccess 文件中有一个 Content-Security-Policy 标头,它适用于包含多个页面的整个网站。每个页面上都有内联元素,我不会(也不能)移动到单独的 .js 文件中,我希望 CSP 也允许它们而不使用“不安全内联”。因此,我想使用动态生成的带有 FALSE 标志的 PHP header() 将它们添加到每个页面的顶部。FALSE 标志(在此处记录)将附加到任何现有的传入标头而不覆盖它。从理论上讲,这应该可以解决我的问题……但事实并非如此。
由于未知原因,我无法在 HTML 内容之前使用 PHP header() 附加或替换 .htaccess 文件中设置的 CSP。下面是演示问题的代码: (1) 页面的 .htaccess 文件;(2) PHP 页面本身。您应该能够轻松重现这一点。(我使用 Chrome 57 进行测试)。
sha256 哈希值用于如下所示的元素;更改其中的一个字符,哈希将不再对其有效。(如果您使用某些浏览器扩展程序,Chrome 可能会抱怨需要额外的哈希值;只需将它们添加到 PHP header();方便地,Chrome 将为您提供每个内联<script>
CSP的正确哈希值)
如果您重新删除 .htaccess 文件中的 CSP 指令,则脚本将执行。为了进一步证明它的工作原理,更改散列中的一个字符并在控制台打开的情况下重新加载页面;它应该报告一个错误,指出 CSP 对脚本无效,然后报告应该使用什么散列来验证(这将是原始散列)。
但是,如果您随后取消对 .htaccess 文件中的 CSP 指令的 rem,则 PHP header() 无效,无论是否带有 FALSE 标志。
这就是问题所在:当 .htaccess 文件具有 CSP 标头时,PHP CSP header() 不起作用。
我不想使用 anonce
并且我不想在 .htaccess 文件中使用unsafe-inline
或unsafe-eval
...而且我不想将哈希添加到 .htaccess 中,因为这就是我想要绕过的.
我的猜测是 .htaccess 文件中需要一个额外的指令,允许激活 PHP CSP header()。任何人都可以命名该指令并显示一种方法来包含额外的 CSP,而不是使用 PHP header(),而是使用<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'sha256-6eM329mc/AyToTIZuNqhbTD9GNw5jUJeTFszXn+hRU8='">
,我更愿意直接写入 HTML 而不是使用 PHP header()(但无论哪种方式的解决方案都可以)。
这是重现此问题的相关代码:
.htaccess:
# The CSP here is pared down for simplicity of illustration
<IfModule mod_headers.c>
Header set Content-Security-Policy "script-src 'self';"
</IfModule>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
小智 4
根据设计,通过 CSP,您只能增加内容安全策略,而不能减少它。
因此,只定义那些您(非常确定)不想在 htaccess 中更改的策略。
例如:
<IfModule mod_headers.c>
Header set Content-Security-Policy "frame-ancestors 'self'; base-uri 'self'"
</IfModule>
Run Code Online (Sandbox Code Playgroud)
然后在“页面”中设置您可能需要更改的所有内容,例如 script-src、connect-src、style-src 等。
归档时间: |
|
查看次数: |
4533 次 |
最近记录: |