如果允许不安全的内联,CSP会保护我们什么

Zer*_*nel 26 security content-security-policy

目前我正在定义内容安全策略(CSP),如下所示;

Header set Content-Security-Policy: "default-src 'self' data:; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;"
Run Code Online (Sandbox Code Playgroud)

考虑到上面的CSP定义,我对内联JavaScript提出了挑战,因为它可以在任何时候被覆盖.

有什么用的unsafe-inline,如果它几乎不保护?

Ana*_*hat 26

unsafe-inline选项是移动或当前站点重写内联代码时不立即选项一起使用,但您仍想使用CSP来控制其他方面(如对象-SRC,第三方的预防注射JS等).你是正确的,unsafe-inline它不提供太多的安全性,因为它允许执行不安全的页内脚本和事件处理程序.

谷歌的CSP评估员是一个很好的工具,可以确定你的政策是否强大.

使用该unsafe-inline选项的用例可以在Google 关于内容安全策略Web开发人员文档中找到:

婚戒讨论论坛管理员希望确保所有资源仅通过安全渠道加载,但实际上并没有编写太多代码; 重写大量的第三方论坛软件,这些软件充满了内联脚本和风格,超出了他的能力范围.以下政策将有效:

Content-Security-Policy: default-src https:; script-src https: 'unsafe-inline'; style-src https: 'unsafe-inline'
Run Code Online (Sandbox Code Playgroud)

即使https:指定了default-src,脚本和样式指令也不会自动继承该源.每个指令都完全覆盖该特定类型资源的默认值.

  • Google Developers 上有很好的解释:https://developers.google.com/web/fundamentals/security/csp/#inline_code_is_thinked_harmful (4认同)

小智 11

虽然我同意它并没有太大的保护,但XSS的经典开发是浏览器开发框架,你在互联网上有一台服务器,当你得到一个XSS漏洞时,你可以访问"http://bad.example.com /hook.js">现在您可以从该服务器控制受害者的浏览器.你告诉它打开一个隐藏的窗口来持久访问,然后你有他们的浏览器的双向通信.

具有"不安全内联"的CSP仍然可能允许所有相同的利用(假设漏洞适合您可以注入的空间),但是连接外部世界接收指令或泄露数据的难度稍大.

这就是说,如果你可以在网页中注入足够复杂的客户端部分,我认为仍然可以通过其他渠道进行大多数相同的攻击.

我的攻击者帽子"自我不安全 - 内联"比没有CSP更难开发.我希望攻击工具能够适应弱的CSP,但这意味着很多常见的漏洞会立即出现,或者更难.