内容安全策略如何与X-Frame-Options配合工作?

71

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

假设我有:

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

浏览器会加载这个frame吗?

不清楚。
一方面,http://a.com明确拒绝框架。
另一方面,http://b.com明确允许对http://a.com进行框架。


请注意,CSP和XFO标头块不会加载站点。站点将被加载,因为请求将被发出。只是在加载后,浏览器会注意到标头,并且不会在框架内显示站点。 - Nux
3个回答

84

frame-src CSP 指令(已过时,被child-src代替)决定了页面上的框架可以使用哪些来源。

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

在您的情况下,带有 X-Frame-Options: DENYhttp://a.com 表明没有其他页面可以在框架中使用它。无论 http://b.com 在其 CSP 中具有什么,都不能使用 http://a.com 在框架中。


X-Frame-Options 与 CSP 相交的地方是通过frame-ancestors指令。从CSP 规范(重点是我的):

此指令类似于几个用户代理实现的 X-Frame-Options 头。 'none' 源表达式与该头的 DENY 大致等效,'self' 等于 SAMEORIGIN,以此类推。主要区别在于许多用户代理实现 SAMEORIGIN 仅针对顶级文档位置进行匹配。该指令检查每个祖先。如果任何祖先不匹配,则取消加载。 [RFC7034]

frame-ancestors指令取代了X-Frame-Options头部。如果资源同时拥有这两个策略,则应执行frame-ancestors策略,并忽略X-Frame-Options策略。

一个旧问题表明它在当时的Firefox中无法使用,但现在希望情况已经改变了。


更新于2018年4月:

内容安全策略:指令“child-src”已被弃用。请使用指令“worker-src”来控制工作者,或使用指令“frame-src”来控制框架。

看起来child-src现在已经被弃用,frame-src重新启用。


“frame-src CSP指令(已被弃用并替换为child-src)”- 这个声明的来源是什么? - sapy
frame-src指令已被弃用。希望管理嵌套浏览上下文的作者应改用child-src指令。看起来计划在CSP3中取消弃用--https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-src#Specifications和https://www.w3.org/TR/CSP/#directive-child-src。 - Anand Bhat
1
是的,Firefox以前没有遵守这个规定,我上次检查是几个月前,但现在它按预期工作。 - Maciej Krawczyk
4
据我目前所知,当前的第三级草案中,child-srcframe-src均未被废弃。如果我理解正确的话,child-src包括了frame-srcworker-src,但说实话,在这一点上,我已经费尽心思,试图理清其中的关系,现在脑子都快崩溃了。 - eaj

14

你的假设都不是普遍适用的真实情况。

  • Chrome 忽略 X-Frame-Options
  • Safari 9 及以下版本忽略 CSP 的 frame-ancestors
  • Safari 10-12 尊重 CSP 的 frame-ancestors 指令,但如果两者同时指定,则优先考虑 X-Frame-Options

1
这对Safari 11和Safari 12同样适用。截至2018年9月,X-Frame-Options仍然优先于CSP。 - png
2
@NathanCH,是的,完全正确。Safari12将XFO放在CSP之上。现在我们面临问题,因为我们在代码中同时使用了SFO-sameorigin和CSP,如“X-FRAME-OPTIONS” - > SAMEORIGIN,“Content-Security-Policy”,“frame-ancestors'self'*.abcd.net”。我们如何指定带有SFO的URL? - Ravi Parmar
8
我需要一篇有关Chrome忽略X-Frame-Options的引用。我找到的数据表明它会忽略ALLOW-FROM,但对于其他值则没问题。 - Dan
IOS Safari 13忽略x-frame-options,转而采用“CSP frame ancestors”。 - Murali Nepalli
你好。此刻,这个答案至少在某种程度上是错误的,因为X-Frame-Options在几乎所有浏览器中都得到了广泛支持,包括被认为是古老版本的Internet Explorer 8! - Félix Adriyel Gagnon-Grenier

3

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

看起来X-Frame-Options是主要因素。
如果目标服务器拒绝框架,则客户端网站无论设置了Content-Security-Policy的什么值,在iframe中都无法显示此页面。

然而,我在文档中没有找到任何确认信息。

在Chrome 54和IE 11上进行了测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接