【问题标题】:How does Content-Security-Policy work with X-Frame-Options?Content-Security-Policy 如何与 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 标头都不会阻止加载站点。该站点将被加载,请求将被发出。只是在加载后浏览器会注意到标题并且不会在框架内显示站点。

标签: http http-headers content-security-policy x-frame-options


【解决方案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 (!)
    猜你喜欢
    • 2015-09-09
    • 2023-03-19
    • 2019-06-25
    • 1970-01-01
    • 2013-05-03
    • 2017-12-07
    • 2021-05-08
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多