如何实施内容安全策略?

How to implement content security policy?

有一些很好的文章解释了 CSP 的选项,例如: http://www.html5rocks.com/en/tutorials/security/content-security-policy/

也许这很明显,因为我找不到任何好的示例,但是您如何在实践中实际实施 CSP?

在 PHP 中,您可以在您提供的页面上设置 header,但是如果您只有一个 HTML 文件怎么办?你必须通过你的网络服务器、apache 或类似的东西来做吗?这似乎不是一个简单的方法。

此处的最佳做法是什么?每个单独的页面都应该手动设置 header?

谢谢!

That doesn't seem an easy approach.

是的,不是。但是,您可以采取一些巧妙的捷径。

how do you actually implement CSP in practise?

In PHP you can set the header on a page you serve, but what if you just have a HTML file? Do you have to do it through your webserver, apache or similar? That doesn't seem an easy approach.

我写了一个命令行 PHP 脚本,它采用 JSON 类似代码块 A 的 blob 组装了一个看起来像代码块 B 的字符串,并将其保存到一个单独的文件中。

甲:

{
    "script-src": [ "self",  "https://apis.google.com" ]
}

乙:

add_header Content-Security-Policy "script-src: 'self' https://apis.google.com";

然后我添加了一行来为该虚拟主机配置我的 nginx 配置以包含生成的 CSP 指令:

include /path/to/script/output.conf;

由于这个系统,如果我想更改 CSP headers,我只需要编辑一个 JSON 文件。

这就是我使 CSP headers 易于管理的方法。您的里程可能会有所不同。

这里是:CSP Builder.

如果您是 运行 Apache,您可以使用 .htaccess 来执行此操作

在您的项目路径中放置一个名为 .htaccess 的文件(通常类似) /var/www/myProject 如果它由于其他原因不存在。在这种情况下,只需添加以下 header 规则:

Header set Content-Security-Policy "
    default-src 'self';
    script-src 'self' www.google-apis.com *.cloudflare.com someotherDomain.com;
    img-src 'self' *.cloudflare.com;
"

现在现代浏览器只会执行来自您的域或 google-apis.com 或 cloudflare.com 或 someotherDomain.com 的脚本 图像只会从您的域和 cloudflare 加载。 其他所有内容都只允许来自您的域。

很好的来源: ole.michelsen.dk

归根结底,选择权在您。 您可以在您的 apache 网络服务器中全局设置它。在这种情况下,它将应用于每个页面。 如果需要更精细的方法,您还可以在各个页面上设置 headers。

查看这些站点以获取有关构建 CSP 规则的帮助:

https://csp-evaluator.withgoogle.com/

https://report-uri.io/home/generate

Scott Helme 对这个主题了解很多,也有一些很好的例子。 您也可以将您的报告发送到他的网站进行一些基本分析。

https://scotthelme.co.uk/content-security-policy-an-introduction/

对于 apache 配置,这可能也很有趣

Generate a nonce with Apache 2.4 (for a Content Security Policy header)

我还强烈建议您阅读这篇论文,其中讨论了一些更新的(并且看起来更简单的)配置方法和浏览器向后兼容性

https://www.websec.be/blog/cspstrictdynamic/

这也是一篇来自 google 研究的优秀论文 "CSP Is Dead, Long Live CSP!",特别是参考了 4.IMPROVING CSP 部分,通过绕过白名单和传播信任。

https://research.google.com/pubs/pub45542.html

大量阅读,当您准备好实施时,使用 REPORT ONLY 模式指令,这样您就可以在不执行策略的情况下获得控制台消息。

Content-Security-Policy-Report-Only: <policy-directive>; <policy-directive>

一旦你开心了,你就可以执行规则了:

Content-Security-Policy: <policy-directive>; <policy-directive>