我在“友好的 iframe”环境中遇到了一个具有挑战性的 iFrame 检测问题。我需要确定从window.top
哪个外部域 iframe 元素window.top.document
加载到自身内部,另一个 iframe 具有相同的域、协议和端口作为window.top
.
所以这里的核心问题是:在页面 A 上,如何在 JavaScript 中确定 iFrame B 包含 iFrame C?同样,Page A 和 iFrame C 属于相同的域、协议和端口,并且可以相互通信。iFrame B 位于不同的域中。我想在页面 A 上找到与 iFrame C 关联的 DOMElement。
可能已经尝试但没有奏效的事情:
document.referrer
匹配。页面 A 将页面 Asrc
上所有 iframe 的document.referrer
属性与 iFrame C 中的属性相匹配。不幸的是,如果页面 A 上的多个 iframe 在 iframe B 上加载具有相同 src 的内容,这将不起作用。如果该src
属性也不起作用iframe B 是about:blank
或javascript:something
。window.location.hash
通过查看src
iframe 的属性进行通信。页面 A 无法获得window.location.hash
iFrame B,所以那里没有运气。- 这必须在 IE 6 和 7 中工作,所以没有window.postMessage 支持。对不起。
附加信息:
这是一个名为“Friendly iFrames”的配置。友好的 iFrame (FIF) 在广告行业中很常见。以下是它们的工作方式:
发布商网站上的一个页面,比如页面 A foo.com,从 some-random-ad-server.com 注入 iframe B。然后在 some-random-ad-server.com 上的 iframe B 内部,从 foo.com 加载另一个 iframe C。所以:
- 我可以从 iFrame C 访问(即 DOM 操作)页面 A。页面 A 可以访问 iFrame C。
- 页面 A 或 iFrame C 上的任何内容都无法访问 iFrame B。