Content-Security-Policy 如何与 X-Frame-Options 一起使用?

Posted

技术标签:

【中文标题】Content-Security-Policy 如何与 X-Frame-Options 一起使用?【英文标题】:How does Content-Security-Policy work with X-Frame-Options? 【发布时间】:2017-03-15 09:37:20 【问题描述】:

Content-Security-Policy 是否忽略服务器返回的 X-Frame-Options,还是 X-Frame-Options 仍然是主要的?

假设我有:

一个网站http://a.com 和X-Frame-Options: DENY 和一个网站http://b.com 和Content-Security-Policy: frame-src a.com

浏览器会加载这个框架吗?

不清楚。 一方面,http://a.com 明确否认框架。 另一方面,http://b.com 明确允许为http://a.com 设置框架。

【问题讨论】:

请注意,CSP 和 XFO 标头都不会阻止加载站点。该站点将被加载,请求将被发出。只是在加载后浏览器会注意到标题并且不会在框架内显示站点。 【参考方案1】:

通过实践测试找到了答案。 我创建了两个网站并重现了所描述的情况。

似乎 X-Frame-Options 是主要的。 如果目标服务器拒绝分帧,则客户端网站无法在iframe 中显示此页面,无论Content-Security-Policy 设置了哪个值。

但是,我没有在文档中找到任何确认。

在 Chrome 54 和 IE 11 上测试。

【讨论】:

【参考方案2】:

frame-src CSP directive(已弃用并由child-src 取代)决定了可以在页面上的框架中使用哪些来源。

另一方面,X-Frame-Options 响应标头决定了哪些其他页面可以在 iframe 中使用该页面。

在您的情况下,http://a.comX-Frame-Options: DENY 表示没有其他页面可以在框架中使用它。 http://b.com 在其 CSP 中的内容无关紧要 -- 任何页面都不能在框架中使用 http://a.com


X-Frame-Options 与 CSP 相交的地方是通过frame-ancestors directive。来自CSP specificiation(强调我的):

这个指令类似于X-Frame-Options 标头,几个 用户代理已经实现。 'none' 源表达式是 大致相当于该标头的DENY'self'SAMEORIGIN, 等等。主要区别在于许多用户代理实现 SAMEORIGIN 这样它只匹配*** 文档的位置。该指令检查每个祖先。如果有的话 祖先不匹配,加载被取消。 [RFC7034]

frame-ancestors 指令淘汰了X-Frame-Options 标头。如果资源同时具有这两种策略,则应强制执行 frame-ancestors 策略,而应忽略 X-Frame-Options 策略。

older question 表示当时这在 Firefox 中不起作用,但希望现在情况有所改变。


2018 年 4 月更新:

内容安全政策:指令“child-src”已被弃用。请使用指令‘worker-src’控制worker,或者指令‘frame-src’分别控制框架。

看起来child-src 现在已弃用,frame-src 又回来了。

【讨论】:

“frame-src CSP 指令(已弃用并由 child-src 取代)”- 此语句的来源是什么? w3.org/TR/CSP2/#directive-frame-src -- "frame-src 指令已被弃用。希望管理嵌套浏览上下文的作者应该使用 child-src 指令。"看起来它计划在 CSP3 中不被弃用——developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… 和 w3.org/TR/CSP/#directive-child-src 是的,Firefox 不尊重这一点,我上次检查是几个月前,但现在它可以正常工作了。 据我所知,child-srcframe-src 在当前的 3 级草案中都没有被弃用。如果我理解正确,child-src 包含frame-srcworker-src,但老实说,在这一点上,我的大脑正在融化,试图弄清楚是什么。【参考方案3】:

你的假设都不是普遍正确的。

Chrome 会忽略 X-Frame-Options。 Safari 9 及更低版本忽略 CSP frame-ancestors。 Safari 10-12 尊重 CSP frame-ancestors 指令,但优先 X-Frame-Options 如果两者都指定。

【讨论】:

Safari 11 和 Safari 12 也是如此。截至 2018 年 9 月,X-Frame-Options 仍然优先于 CSP。 @NathanCH,是的,完全正确.. Safari12 将 XFO 优先于 CSP。现在我们面临问题,因为我们在代码中都使用 SFO-sameorigin 和 CSP 作为“X-FRAME-OPTIONS”--> SAMEORIGIN “Content-Security-Policy”,“frame-ancestors 'self' *.abcd.net ”。我们如何使用 SFO 指定 URL? 我需要忽略 X-Frame-Options 的 Chrome 引用。我能找到的数据表明它忽略了 ALLOW-FROM,但对于其他值来说很好。 ios Safari 13 忽略 x-frame-options 支持“CSP 框架祖先” 嗨。在这个时刻,这个答案至少部分是错误的,因为 X-Frame-Options 在几乎所有浏览器中得到广泛支持,从被视为古老版本的版本开始,甚至 Internet Explorer 8 (!)

以上是关于Content-Security-Policy 如何与 X-Frame-Options 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

Content-Security-Policy

在 nginx 中添加 Content-Security-Policy 后 websocket 连接失败

如何让 Google Tag Manager 和 Content-Security-Policy 共存?

在 Angular 站点中使用 content-security-policy 的最佳实践是啥?

无法为具有可变脚本地址的 chrome newtab 扩展加载脚本“Content-Security-Policy”

未找到 Content-Security-Policy 元标记错误