4

今天我将我的 Firefox 升级到 13.0。但是我的 javascript 代码出了点问题。

有一个网页A(www.xx.com)和网页B(webim.xx.com)。我使用iframe标记将 B 嵌入到 A 中。

网页A

首先将域设置为“xx.com”

<script>document.domain = 'xx.com';</script>

然后创建一个 iframe 来加载网页 B。

<script>
var iframe = document.createElement('iframe');
document.body.insertBefore(iframe, document.body.firstChild)
iframe.src = 'http://webim.xx.com';
</script>

网页 B 将域设置为 'xx.com'

<script>document.domain = 'xx.com';</script>

然后我访问网页B的localStorage。

在网页A上,执行代码:

window.iframe.contentWindow.localStorage.setItem('a', 'a')

然后会报错:

Error: The operation is insecure.

在以前的版本或其他浏览器中,代码可以正常执行。

有人知道为什么吗?

这是一个错误?

和..如何解决这个问题?谢谢。


刚才我找到了解决这个问题的方法。

我不能直接访问localStorage,但是我可以调用iframe的函数,它可以调用自己网页的localStroage。

/// webpage B
<script>
document.domain = 'xx.com';
var ls = { ///< ls is short for localStorage.
    setItem: function(k, v) {
        return localStorage.setItem(k, v);
    },
    getItem: function(k) {
        return localStorage.getItem(k);
    },
    removeItem: function(k) {
        return localStorage.removeItem(k);
    },
    clear: function(){
        return localStorage.clear();
    }
}
</script>

然后我调用ls.setItem等来访问 iframe 的 localStorage。

/// webpage A
<script>iframe.ls.setItem('a', 'b');</script>

即使我可以解决这个问题,为什么firefox 13.0会导致这个问题?

4

1 回答 1

4

旧的 Firefox 行为是错误的,并且该错误已得到修复。根据规范,设置 document.domain 应该对 localStorage 的行为绝对没有影响,因此在您的情况下,您尝试为不同的域设置 localStorage,这是不允许的。

有关详细信息,请参阅https://bugzilla.mozilla.org/show_bug.cgi?id=495337和 localStorage 规范。

于 2012-06-08T15:08:37.957 回答