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.com
和 X-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-src
和 frame-src
在当前的 3 级草案中都没有被弃用。如果我理解正确,child-src
包含frame-src
和worker-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 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
在 nginx 中添加 Content-Security-Policy 后 websocket 连接失败
如何让 Google Tag Manager 和 Content-Security-Policy 共存?
在 Angular 站点中使用 content-security-policy 的最佳实践是啥?