X-Frame-Options:Firefox和Chrome中的ALLOW-FROM


75

根据本文,我正在实现“传递”功能,X-Frame-Options以使合作伙伴网站将我的雇主网站包装在iframe中:http : //blogs.msdn.com/b/ieinternals/archive/2010/03/30 /combating-clickjacking-with-x-frame-options.aspx

(拆分要发布的网址)

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

我们的过滤器会从网址中选择合作伙伴TLD(如果提供),并根据白名单对其进行验证。如果它在列表中,我们将为X-Frame-Options标题提供值ALLOW-FROM topleveldomain.com(并为将来的点击添加cookie)。如果不在我们的白名单中,我们将发货SAMEORIGINDENY

问题在于,ALLOW-FROM domain对于最新的Firefox和Google Chrome,发送结果似乎没有任何操作。至少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在相关(桌面)浏览器中真正实现的任何见解?也许语法已更改?

一些有趣的链接:


如果您自己想出更多解决方案,请随时发布您自己的答案。你会得到我的支持!
Prestaul 2012年

昨天已为Firefox添加了一个补丁:bugzilla.mozilla.org/show_bug.cgi ?
id=690168

旧问题,但出于后代考虑-您所描述的方法(将TLD作为iframe的参数传递)很容易被想要嵌入您的内容的任何人击败。他们只是查看源代码,查看您在做什么,以及复制/粘贴。由于ALLOW-FROM尚不可靠,因此您可以使用一个共享机密,该共享机密将使用当前时间(在窗口内)进行加密散列,并包含在iframe URL中。在iframe上,验证哈希共享密钥。内容窃贼可以窃取该哈希,但只能在一个短暂的窗口中使用,有效地阻止了未经授权的嵌入。
马克

Answers:


41

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

您已经在做一个自定义标头并向其发送正确数据的工作,当检测到标头来自有效伙伴并将DENY添加到其他每个请求时,您是否可以不仅仅排除标头?当您已经在动态构建逻辑时,我看不到AllowFrom的好处吗?


他正在链接的msdn页面上的Tokens标题下实现4步安全性,不幸的是,该安全性不适用于chrome和safari。
rbrc

是的,我知道,这就是为什么我建议相反的方法。
Kinlan

4
然后,他将查看引荐来源标头,这是一种不错的方法,尽管引荐来源的欺骗仍然存在。如果所有有问题的页面都是HTTPS,则很难做。AllowFrom绝对是更好的选择。
rbrc

感谢您的答复和建议!
罗布

3
抱歉,编辑切断了我的解释!我们认为来自客户端的HTTP_REFERER是用于控制决策的不可靠机制。此外,我们发现某些浏览器(尤其是我相信IE的浏览器)没有从包含iframe的顶级页面传递HTTP_REFERER。因此,我们没有可靠的方法来告诉谁是服务器上的我们。
罗布

23

我发布了这个问题,却没有看到反馈(似乎是在几个月后才出现的)。

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

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

希望这会有所帮助,对于花这么长时间关闭循环感到抱歉!


7
以当前形式,X-Content-Security-Policy不提供的跨浏览器类似物ALLOW-FROM。Firefox支持frame-ancestors,并且即将发布的规范也支持frame-options。目前,Chrome仅frame-ancestors在运行时标志后面支持这些功能。frame-src可用,但这是控制子框架的父框架,而不是指定允许的父框架的子框架。
JT。


9

对于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。
另外,请注意,您需要进行浏览器检测,以避免allow-from为Chrome添加标题(控制台上输出错误)。

有关详细信息,请在此处查看我的答案。


7
如果要避免点击劫持,可以使用Content-Security-Policy,但绝对不能通过添加'default-src'属性,因为这样做的效果完全不同。您将要使用“框架祖先”。这与X-Frame-Options相似,但更为灵活,因为它允许您指定多个域。请参阅:martijnvanlambalgen.wordpress.com/2015/06/28/clickjacking
Myrddin81'9
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.