从 iframe 调用父窗口方法(不同)
Posted
技术标签:
【中文标题】从 iframe 调用父窗口方法(不同)【英文标题】:Calling parent window method from Iframe (different) 【发布时间】:2012-10-30 01:36:13 【问题描述】:我在域上有一个页面:
http://main.mydomain.com/frame.cfm 包含一个 iframe, 加载域http://www.anotherdomain.com。
这个页面http://www.anotherdomain.com有一个脚本引用http://sub.mydomain.com/somescript.js
这个 somescript 是一个类似于 google Analytics 的跟踪脚本,它会随 www.anotherdomain.com 的每个请求一起加载。
在某个阶段,www.anotherdomain.com页面中的脚本http://sub.mydomain.com/somescript.js会尝试调用window.top.aFunction(); or parent.aFunction();
让父窗口做一些事情。
我知道 X-Frame-Options 和 Access-Control-Allow-Origin 标头并尝试了两者,但是当我在 www.anotherdomain.com 上的 iframe 中浏览时,我在 Firebug 中收到一条错误消息,告诉我:
Error: Permission denied to access property 'relocate'window.top.aFunction();
在 main.domain 站点上的 web.config 中,我有以下规则:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="http://sub.mydomain.com" />
<add name="X-Frame-Options" value="ALLOW-FROM http://sub.mydomain.com" />
</customHeaders>
</httpProtocol>
我认为应该授予 sub.mydomain.com 访问 main.mydomain.com 上的脚本的权限。
我正在我的电脑上本地使用除 www.anotherdomain.com 以外的所有域进行测试,并提供主机参考。
知道我在这里缺少什么吗?
【问题讨论】:
【参考方案1】:您不能通过跨域 iFrame 访问父窗口函数的方法。它违背了 Same Origin Policy 。 X-Frame
http 标头响应告诉浏览器是否允许在 iFrame 中呈现页面,并且对您的情况没有帮助。
我推荐的解决方案是使用window.postMessage()
在两个框架之间进行通信。看http://ejohn.org/blog/cross-window-messaging/
【讨论】:
嗯,好的。看起来有点像解决方法,是吗? Internet Explorer 似乎还不支持它。而且我确实需要支持 IE7+。关于同源策略:我发现我的脚本页面和框架页面位于同一个主域上,这很烦人。在我看来,这应该提供足够的安全性吗?我也可以将脚本放在 main.mydomain.com 域上,但我有一个在那里运行的框架,它将捕获我的单独脚本请求,并且需要一些编码以在框架上下文中忽略此脚本。不是很优雅 谢谢!我还注意到我可以通过 iframe 中的脚本将 parent.location 设置为其他内容。在父级中调用一个函数与直接设置它一样,显然是不同的,安全方面。有点奇怪。此外,如果他们不那么严格,那就太好了;不要着眼于子域,而是着眼于域。以我目前的观点应该足够安全。以上是关于从 iframe 调用父窗口方法(不同)的主要内容,如果未能解决你的问题,请参考以下文章