带有iframe的跨域localStorage(Chrome)

时间:2012-05-25 22:37:21

标签: javascript google-chrome iframe local-storage

我正在尝试使用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。有没有人知道是否有办法绕过这个特定的安全“功能”?或者我做错了什么?

3 个答案:

答案 0 :(得分:1)

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

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

我认为Chrome的配额为2.5mb,与FF不同,后者有5mb的localStorage配额。

答案 1 :(得分:0)

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

在IE和Edge中未阻止此操作的原因是这些浏览器允许网站向服务器发送先前设置为第一方Cookie的第三方Cookie,但第三方Cookie已被阻止。例如,如果用户定期访问Facebook,他会从Facebook获取第一方Cookie。当他随后使用Facebook的分享按钮访问其他网站时,Facebook可以跟踪他,虽然第三方cookie被禁用。我真的不知道为什么IE和Edge不会阻止第三方cookie发送,但我还是不会使用这些浏览器。

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

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

Firefox:SecurityError: The operation is insecure.

IE和Edge:没有错误,虽然禁用了第三方Cookie,但仍可以访问iframe中的localStorage。

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

答案 2 :(得分:0)

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

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