情况如下:
页面A包含iframe B,B包含iframe C,A和B在同一个域下,C在另一个域下。
C尝试使用“#”后面的额外信息重置父B的位置,以使用Fragment Id Messaging解决跨域通信。
IE6 / 7/8在这种情况下运行正常,而Firefox阻止 parent.location 设置并显示错误消息[访问属性被拒绝“代码:”1010 ]。
但如果B是顶部窗口,意味着没有A,那么Firefox也存在。
对我来说很奇怪......你能帮忙吗?
谢谢!
答案 0 :(得分:15)
历史上,任何窗口都可以更改任何其他窗口的位置。这结果是一个问题,因为,除其他外,它意味着在窗口中嵌入登录iframe是不安全的(因为那时恶意网站可以用欺骗版本替换登录iframe)。随着时间的推移,对浏览器窗口的位置更改进行了进一步的限制,直到现在,当HTML5和大多数浏览器达成the ancestor policy上的共同协议时。简而言之,在解释HTML5规范时,窗口A可以更改另一个窗口B的位置iff:
window.open
打开的窗口,A可以更改打开B的窗口的位置(因此B是由A打开的弹出窗口,由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 = "...";