跨域JavaScript父位置设置firefox错误

时间:2009-07-21 03:56:43

标签: javascript firefox iframe cross-domain

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

IE6 / 7/8在这种情况下运行正常,而Firefox阻止 parent.location 设置并显示错误消息[访问属性被拒绝“代码:”1010 ]。 但如果B是顶部窗口,意味着没有A,那么Firefox也存在。

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

谢谢!

2 个答案:

答案 0 :(得分:15)

历史上,任何窗口都可以更改任何其他窗口的位置。这结果是一个问题,因为,除其他外,它意味着在窗口中嵌入登录iframe是不安全的(因为那时恶意网站可以用欺骗版本替换登录iframe)。随着时间的推移,对浏览器窗口的位置更改进行了进一步的限制,直到现在,当HTML5和大多数浏览器达成the ancestor policy上的共同协议时。简而言之,在解释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的东西;或者,你可以ask your page B to change its own location

希望这是有用的信息,如果不一定有帮助的话。浏览器安全模型并非设计 evolved ,并且只有最近在HTML5中的工作才真正被确定为解决这些跨浏览器的不一致问题。< / p>

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

答案 1 :(得分:0)

从C,您可以使用window.top访问B的窗口。

尝试,var B = window.top; B.location = "...";