“友好的iFrame”检测:如何在首页找到我的嵌套iframe?

时间:2012-10-24 21:49:13

标签: javascript dom iframe cross-domain

我在“友好的iframe”环境中遇到了具有挑战性的iFrame检测问题。我需要从window.top中识别window.top.document中的哪个外域iframe元素在其自身内部加载另一个与window.top具有相同域,协议和端口的iframe。

所以这是一个核心问题:在页面A上,如何在JavaScript中确定iFrame B包含iFrame C?同样,Page A和iFrame C属于同一个域,协议和端口可以互相沟通。 iFrame B位于不同的域中。我想在页面A上找到与iFrame C相关联的DOMElement。

可能已经尝试过但没有奏效的事情:

  • document.referrer匹配。页面A将页面A上所有iframe的src属性与iFrame C中的document.referrer属性相匹配。不幸的是,如果页面A上的多个iframe在iframe B上加载内容相同的src,则此功能不起作用。如果iframe B的src属性为about:blankjavascript:something,它也无效。
  • 通过查看iframe的window.location.hash属性进行
  • src通信。页面A无法获得iFrame B的window.location.hash,因此没有运气。
  • 这必须在IE 6和7中工作,因此没有 window.postMessage支持。遗憾。

其他信息

这是一个名为“Friendly iFrames”的配置。友好的iFrames(FIF)在广告业中很常见。以下是它们的工作原理:

发布商网站上的一个页面,例如Page A foo.com,从some-random-ad-server.com注入iframe B.然后在some-random-ad-server.com上的iframe B内部,从foo.com加载另一个iframe C.所以:

  • 我可以从iFrame C访问页面A(即DOM操作)。页面A可以访问iFrame C.
  • 页面A或iFrame C上的任何内容都无法访问iFrame B.

1 个答案:

答案 0 :(得分:0)

我意识到这已经过时了,但我对客户端解决方案感到好奇并且遇到了这个帖子。我正在使用服务器端处理这个,为什么不使用服务器端作为最后的手段?授予引用者在服务器端是粗略的,但是在处理iframed页面时,引用者非常可靠,可以与本地应用程序的主机和引用应用程序进行比较。

以下是我在ASP.NET / C#中的表现(同样的事情可以用PHP等完成)

// set referrer
if (Request.UrlReferrer != null && Request.Url.Host != Request.UrlReferrer.Host)
{
    Session["Referrer"] = Request.UrlReferrer.OriginalString;
}