【问题标题】:X-Frame-Options: ALLOW-FROM in firefox and chromeX-Frame-Options:Firefox 和 chrome 中的 ALLOW-FROM
【发布时间】:2012-05-26 08:53:46
【问题描述】:

我正在为X-Frame-Options 实施“直通”,以让合作伙伴网站将我雇主的网站包装在 iframe 中,如本文所述:http://blogs.msdn.com/b/ieinternals/archive/2010/03/30/combating-clickjacking-with-x-frame-options.aspx

(拆分 URL 以发布)

简而言之,我们合作伙伴的页面有一个 iframe,其中包含一个针对我们域的 URL。 对于我们域中的任何页面,他们都会添加一个特殊的 url 参数,例如 &@mykey=topleveldomain.com,告诉我们页面的顶级域是什么。

我们的过滤器从 URL 中提取合作伙伴 TLD(如果提供),并根据白名单对其进行验证。如果它在列表中,我们会发送带有值 ALLOW-FROM topleveldomain.comX-Frame-Options 标头(并添加 cookie 以供将来点击)。如果它不在我们的白名单上,我们会发送SAMEORIGINDENY

问题在于,对于最新的 Firefox 和 Google Chrome,发送 ALLOW-FROM domain 会导致整体无操作。至少,IE8 似乎正确实现了ALLOW-FROM

查看此页面:http://www.enhanceie.com/test/clickjack。在“应该显示内容”的第 5 个(共 5 个)框之后,是一个不应该显示内容的框,但它是。在这种情况下,iframe 中的页面发送X-Frame-Options: ALLOW-FROM http://www.debugtheweb.com,这是一个与http://www.enhanceie.com 截然不同的顶级域名。然而,框架仍然显示内容。

关于X-Frame-Options 是否真正在相关(桌面)浏览器中使用ALLOW-FROM 实现有任何见解吗?可能语法变了?

一些感兴趣的链接:

【问题讨论】:

  • 如果您自己想出更多答案,请随时发布您自己的答案。你会得到我的支持!
  • 昨天为 Firefox 添加了一个补丁:bugzilla.mozilla.org/show_bug.cgi?id=690168 我们会看看它是否能通过审核并很快发布到您附近的浏览器中......
  • 老问题,但为了后代 - 您描述的方法(将 TLD 作为参数传递给 iframe)很容易被任何想要嵌入您的内容的人击败。他们只会查看源代码,查看您在做什么,然后复制/粘贴。由于 ALLOW-FROM 尚不可靠,您可以使用一个共享密钥,该密钥与当前时间(在一个窗口内)进行加密散列并包含在 iframe URL 中。在 iframe 端,验证散列共享密钥。内容窃贼可以窃取该哈希值,但它只能在一个短暂的窗口内起作用,从而有效地阻止未经授权的嵌入。

标签: firefox google-chrome x-frame-options clickjacking


【解决方案1】:

Chrome 或 Safari 不支持 ALLOW-FROM。见 MDN 文章:https://developer.mozilla.org/en-US/docs/Web/HTTP/X-Frame-Options

您已经在制作自定义标头并将其与正确的数据一起发送,您能否在检测到该标头来自有效合作伙伴时排除该标头并将 DENY 添加到所有其他请求?当您已经在动态构建逻辑时,我看不到 AllowFrom 的好处吗?

【讨论】:

  • 他在链接的 msdn 页面上的 Tokens 标题下实现了 4 步安全性,不幸的是,这在 chrome 和 safari 中不起作用。
  • 是的,我知道,这就是为什么我建议反其道而行之。
  • 那时他会查看referer header,这是一种不错的做法,尽管referer spoofing 仍然存在并且很好。如果所有有问题的页面都是 HTTPS,则要做到这一点要困难得多。 AllowFrom 肯定会更好。
  • 感谢您的回复和建议!
  • 抱歉,编辑打断了我的解释!我们认为来自客户端的 HTTP_REFERER 是用于控制决策的不可靠机制。此外,我们发现一些浏览器(尤其是我相信 IE)不会从包含 iframe 的顶级页面传递 HTTP_REFERER。所以我们没有可靠的方法来判断是谁从服务器陷害了我们。
【解决方案2】:

我发布了这个问题,但从未看到反馈(似乎是几个月后才出现的:)。

正如 Kinlan 所述,并非所有浏览器都支持 ALLOW-FROM 作为 X-Frame-Options 值。

解决方案是根据浏览器类型进行分支。对于 IE,发送X-Frame-Options。对于其他所有人,请发送X-Content-Security-Policy

希望这会有所帮助,很抱歉花了这么长时间才结束循环!

【讨论】:

  • 在其当前形式中,X-Content-Security-Policy 不提供ALLOW-FROM 的跨浏览器模拟。 Firefox 支持frame-ancestors,即将推出的规范支持frame-options。目前,Chrome 仅在运行时标志后面支持这些 frame-ancestorsframe-src 可用,但这是控制子框架的父框架,而不是指定其允许的父框架的子框架。
【解决方案3】:

对于 Chrome,而不是

response.AppendHeader("X-Frame-Options", "ALLOW-FROM " + host);

你需要添加Content-Security-Policy

string selfAuth = System.Web.HttpContext.Current.Request.Url.Authority;
string refAuth = System.Web.HttpContext.Current.Request.UrlReferrer.Authority;
response.AppendHeader("Content-Security-Policy", "default-src 'self' 'unsafe-inline' 'unsafe-eval' data: *.msecnd.net vortex.data.microsoft.com " + selfAuth + " " + refAuth);

到 HTTP-response-headers。
请注意,这假设您在服务器上检查了是否允许 refAuth。
另外,请注意,您需要进行浏览器检测以避免为 Chrome 添加 allow-from 标头(在控制台上输出错误)。

详情见my answer here.

【讨论】:

  • 如果你想避免点击劫持,可以使用Content-Security-Policy,但绝对不能通过添加'default-src'属性,因为它具有完全不同的效果。您将要使用“框架祖先”。这类似于 X-Frame-Options,它更灵活一点,因为它允许您指定多个域。见:martijnvanlambalgen.wordpress.com/2015/06/28/clickjacking
猜你喜欢
  • 2012-04-29
  • 2016-12-09
  • 2019-03-25
  • 1970-01-01
  • 2015-08-24
  • 2016-12-14
  • 2017-06-19
  • 2017-08-02
  • 2012-01-23
相关资源
最近更新 更多