【发布时间】:2009-06-15 23:46:25
【问题描述】:
我有一个包含 iframe 的窗口,包含 iframe,如下所示:
+---------------+
| Top |
| +-----------+ |
| | Middle | |
| | +-------+ | |
| | | Inner | | |
| | +-------+ | |
| +-----------+ |
+---------------+
Top 和 Middle 在同一个域中,但 Inner 在不同的域中。我需要 Inner 与 Top 沟通。我知道在 IE7 中支持(我需要支持)的唯一方法是更改窗口位置的哈希值。但是,我不希望位置栏中的信息闪烁,所以我引入了中间 iframe。
我希望 Inner 更改 Middle 的哈希值。 Middle 将读取其哈希值并通知 Top,它有权直接与之交谈。
但是,在 Firefox 3 中,我无法从 Inner 写入 Middle 的哈希值。没有引发错误,但哈希看起来没有变化。写入其location.href 会引发权限错误。
Top 可以写 Middle 的 hash,但是 Middle 可以写 Inner 的 hash,Top 可以写 Inner 的 hash,Inner 和 Middle 都可以写 Top 的 hash,所以 只有有序对 那行不通的就是我想要的! (我已经为此工作了一段时间。)
我已经在一个最小的测试用例中重现了这一点。起初,我为同一个域的所有三个页面提供服务。当我将 Inner 放在不同的域上时,我得到了有问题的行为。当我把 Middle 放在第二个域上时,每个人都可以再次给每个人写信。
为什么 Inner 不能写入 Middle 的哈希?
附录:由于同源政策,许多人认为这不应该是可能的。这正是我试图绕过的政策。这种确切的情况——设置(但不读取)另一个窗口的位置——应该可以跨域进行。我还没有找到这种效果的浏览器文档,但是我找到了很多文章和演示。这本质上是 HTML 5 的 postMessage() 的前身。
参考:http://softwareas.com/cross-domain-communication-with-iframes
【问题讨论】:
-
听起来可能是安全问题。
-
在 SO 上有一个关于这个问题的问题——Bugzilla 中的一个错误。
-
@Eric:很高兴知道。你有那些链接吗?将它们发布为答案,我会接受。
标签: javascript firefox iframe security