10

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

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

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

谢谢!

4

2 回答 2

15

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

  • 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 实施的政策。

于 2009-07-21T18:14:11.903 回答
0

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

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

于 2009-07-21T04:07:40.653 回答