跨域JavaScript父位置设置firefox错误

Xia*_* Xu 10 javascript iframe firefox cross-domain

情况就是这样:
页面A包含iframe B,B包含iframe C,A和B在同一个域下,C在另一个域下.
C尝试使用"#"后面的额外信息重置父B的位置,以使用Fragment Id Messaging解决跨域通信.

IE6/7/8在这种情况下运行正常,而Firefox会阻止parent.location设置,并显示错误消息[ Access to property denied"code:"1010 ].但如果B是顶部窗口,意味着没有A,那么Firefox也存在.

这对我来说很奇怪......你能帮忙吗?

谢谢!

Jef*_*den 15

从历史上看,任何窗口都可以更改任何其他窗口的位置.这结果是一个问题,因为,除其他外,它意味着在窗口中嵌入登录iframe是不安全的(因为那时恶意网站可以用欺骗版本替换登录iframe).随着时间的推移,对浏览器窗口的位置更改进行了进一步的限制,直到现在,当HTML5和大多数浏览器达成了对祖先策略的共同协议时.简而言之,在解释HTML5规范时,窗口A可以改变另一个窗口B的位置iff:

  • A和B的位置具有相同的原点,也就是说它们具有相同的方案,主机和端口(http,stackoverflow.com,例如80),或者
  • B是顶级窗口,A是嵌套在B内某个深度的框架中的窗口(直接孩子,孩子的孩子等),或者
  • B是一个打开的窗口window.open,A可以改变打开B的窗口的位置(因此B是由A打开的弹出窗口,由A打开的弹出窗口,或者更深),或者
  • B不是顶级窗口,而是其父窗口或其父窗口,或者在某些类似的父级窗口中,该窗口的位置和A是同源的

(相同的起源比这更复杂,但上面的嵌入式描述捕获了它的本质并涵盖了最常见的情况.)

根据此政策,C可能会更改A的位置,A可能会更改B或C的位置,但C可能不会更改B的位置.如果您需要解决此问题,那么您应该将页面A的位置更改为适当改变B的东西; 或者,您可以要求您的页面B更改自己的位置.

希望这是有用的,如果不一定有帮助.浏览器安全模型并没有像进化那么多设计,只有最近在HTML5中的工作才真正被确定为解决这些跨浏览器的不一致问题.

所有这一切,我很惊讶IE7和IE8为你工作 - 我的理解上述政策主要是基于IE7实施的政策.