【问题标题】:How to append/overide .htaccess Content-Security-Policy with PHP CSP header()如何使用 PHP CSP header() 附加/覆盖 .htaccess Content-Security-Policy
【发布时间】: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 文件中使用 nonceunsafe-inlineunsafe-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


【解决方案1】:

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

所以只定义那些你(很确定)你不想在 htaccess 中更改的策略。

例如:

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

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

【讨论】:

  • 感谢您的回复。您的解决方案是有道理的,但我想知道如何在 SPA 应用程序中实现它,在页面导航期间不会重新加载网站,并且在导航期间会更改 html 的 BODY。这似乎使解决方案不起作用,因为只能在呈现 HTML 之前发送标头。任何线索如何在 SPA 中处理这个问题? (我现在专门从 PHP 发送标头,但主体是相同的。)
猜你喜欢
  • 1970-01-01
  • 2016-11-01
  • 1970-01-01
  • 2022-01-03
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
相关资源
最近更新 更多