如何使用 PHP CSP header() 追加/覆盖 .htaccess Content-Security-Polic



我的.htaccess文件中有一个Content-Security-Policy标头,它适用于具有许多页面的整个网站。每个页面上都有内联元素,我不会(也不能)移动到单独的.js文件,我希望CSP也允许它们,而无需使用"不安全的内联"。因此,我想使用动态生成的 PHP header() 和 FALSE 标志集将它们添加到每个页面的顶部。FALSE 标志(在此处记录)将附加到任何现有的传入标头,而不会覆盖它。从理论上讲,这应该可以解决我的问题...但事实并非如此。

由于未知的原因,我无法在我的 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() 不起作用。

我不想使用nonce,也不想在 .htaccess 文件中使用unsafe-inlineunsafe-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>

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>

根据设计,使用 CSP,您只能增加内容安全策略,而不能减少它。

因此,只定义那些您(非常确定)不想在 htaccess 中更改的策略。

例如:

<IfModule mod_headers.c>
Header set Content-Security-Policy "frame-ancestors 'self'; base-uri 'self'"
</IfModule>

然后在您的"页面"中设置您可能需要更改的所有内容,例如script-src,connect-src,style-src等。

相关内容

  • 没有找到相关文章

最新更新