【问题标题】:How to implement content security policy?如何实施内容安全策略?
【发布时间】:2015-04-27 06:25:52
【问题描述】:

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

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

在 PHP 中,您可以在所服务的页面上设置页眉,但是如果您只有一个 HTML 文件怎么办?您是否必须通过您的网络服务器、apache 或类似服务器进行操作?这似乎不是一个简单的方法。

这里的最佳做法是什么?提供的每个单独页面都应该手动设置标题?

谢谢!

【问题讨论】:

    标签: php security content-security-policy


    【解决方案1】:

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

    查看这些网站以获取有关建立 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/

    这也是一篇出色的论文“CSP 已死,CSP 万岁!”来自谷歌研究,特别是参考第 4 节。通过绕过白名单和传播信任来改进 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>
    

    【讨论】:

    • 在 apache 服务器上实现此功能时遇到了 2 个调试问题。 1. 尽管 json.org/json-en.html 说 JSON 中不允许使用单引号,但在实现 Report-To 标头时,我能够(并且只能使用)单引号(转义双引号没有工作):Header always set Report-To "{'group': 'csp-endpoint', 'max_age': 10886400, 'url': '/csp-violation-report-endpoint.php'}"。 2. 客户端广告拦截器可能会阻止 POST 以报告 CSP 违规。我在测试我的解决方案时遇到了 uBlock 问题,但禁用 uBlock 效果很好。 HTH!
    【解决方案2】:

    这似乎不是一个简单的方法。

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

    您如何在实践中实际实施 CSP?

    在 PHP 中,您可以在所服务的页面上设置页眉,但是如果您只有一个 HTML 文件怎么办?您是否必须通过您的网络服务器、apache 或类似服务器进行操作?这似乎不是一个简单的方法。

    我编写了一个命令行 PHP 脚本,它采用类似于代码块 A 的 JSON 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 标头,我只需要编辑一个 JSON 文件。

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

    这里是:CSP Builder

    【讨论】:

    • 感谢您的回答。那么通过这种设置,所有页面是否都具有相同的 CSP 设置?这将是一个限制,我想这是一个权衡。
    • 我不一定会称之为限制。您可以简单地选择不为特定虚拟主机设置此设置,并在每页的基础上进行设置,但需要注意的是,如果您想添加自己的资源,则必须由 PHP 脚本处理所有资源标题。
    • 如果我将此添加到我的 php 脚本中,浏览器将无法再加载任何必需品:header("Content-Security-Policy: default-src 'self';script-src 'self'");
    【解决方案3】:

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

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      • 2013-10-09
      • 2015-07-28
      相关资源
      最近更新 更多