6

我正在尝试使用 iframe 将值存储在另一个域上(实际上,我使用的是http://xauth.org/info/上的 xauth 库)。但是,当我尝试使用 Chrome 存储任何内容时,它会返回“QUOTA_EXCEEDED_ERR: DOM Exception 22”,我认为这是访问错误。我在下面模拟了几个非常简单的页面来复制效果:

文件 1.html:

<html>
<head/>
<iframe src='http://127.0.0.1/2.html' />
</html>

文件 2.html:

<html>
<head/>
<script>
console.log(localStorage);
localStorage.setItem('test', '123');
</script>
</html>

如果我将这两个都放在我的本地服务器上并访问 localhost/1.html 它会嵌入一个来自 127.0.0.1 的框架(Chrome 认为它是一个单独的域),我会得到与上面相同的访问错误。猜测一下,即使我从另一个域嵌入了 iframe,并且 iframe 中的脚本正确引用了该域的 localStorage(正如我在 console.log(localStorage) 行中看到的那样),权限用于写入 localStorage 的内容来自首页的域。

简而言之,看起来没有 iframe 可以写入 Chrome 中的 localStorage。有谁知道是否有办法绕过这个特定的安全“功能”?还是我做错了什么?

4

3 回答 3

5

仅当禁用第三方 cookie 时才会出现此问题。较新版本的 Firefox 和 Opera 也阻止了它。在 IE 和 Edge 中,尽管禁用了第三方 cookie,但它仍然是可能的。如果 localStorage 不会在 iframe 中被阻止,则网络跟踪器可以简单地包含 iframe,读取 cookie,将其发送到父脚本,然后将其发送到服务器。

这在 IE 和 Edge 中没有被阻止的原因是这些浏览器允许网站将之前设置为第一方 cookie 的第三方 cookie 发送到服务器,尽管第三方 cookie 被阻止了。例如,如果用户定期访问 facebook,他会从 facebook 获取第一方 cookie。然后当他使用 facebook 的分享按钮访问其他网站时,尽管第三方 cookie 被禁用,但 facebook 可以跟踪他。我真的不知道为什么 IE 和 Edge 不阻止第三方 cookie 发送,但无论如何我都不会使用这些浏览器。

禁用第三方 cookie 时浏览器显示的错误:

铬和歌剧:Uncaught DOMException: Failed to read the 'localStorage' property from 'Window': Access is denied for this document.

火狐:SecurityError: The operation is insecure.

IE 和 Edge:没有错误,尽管禁用了第三方 cookie,但可以访问 iframe 中的 localStorage。

因此,总而言之,无法绕过此安全功能(在 Chrome、Firefox、Opera 中),这有助于确保用户的隐私。

于 2017-05-21T13:10:04.437 回答
1

好吧,localStorage它是基于域的,您的示例代码没有理由失败。它实际上所做的是将 127.0.0.1 的test项目设置为123,而它将 localhostlocalStorage留空。

这可能不是您最初 QUOTA_EXCEEDED_ERR 问题的答案,但只需尝试切换到 Chrome 上的隐私浏览 (Ctrl+Shift+N) 以查看是否仍有错误。如果没有关于你最初在做什么的更多信息,我不能说太多,但我相信超过配额意味着它意味着什么......

而且我认为 Chrome 的配额是 2.5mb,而 FF 的 localStorage 配额是 5mb。

于 2012-05-25T23:08:02.097 回答
1

这是一个旧帖子,但如果其他人看到它 - 您可以使用 postMessage

https://stackoverflow.com/a/40469196/4836581

于 2019-08-07T14:23:19.823 回答