Javascript 带iFrame的跨域本地存储(Chrome)

Javascript 带iFrame的跨域本地存储(Chrome),javascript,google-chrome,iframe,local-storage,Javascript,Google Chrome,Iframe,Local Storage,我试图使用iframe在另一个域上存储一个值(实际上,我使用的是位于的xauth库)。然而,当我尝试使用Chrome存储任何东西时,它会返回“QUOTA\u Exception\u ERR:DOM Exception 22”,我已经意识到这是一个访问错误。我在下面模拟了两个非常简单的页面来复制效果: 文件1.html: <html> <head/> <iframe src='http://127.0.0.1/2.html' /> </html>

我试图使用iframe在另一个域上存储一个值(实际上,我使用的是位于的xauth库)。然而,当我尝试使用Chrome存储任何东西时,它会返回“QUOTA\u Exception\u 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>

log(本地存储);
setItem('test','123');
如果我将这两个都放在本地服务器上并访问localhost/1.html,它会嵌入127.0.0.1(Chrome将其视为一个单独的域)中的一个框架,我会得到与上面相同的访问错误。据猜测,即使我嵌入了来自另一个域的iframe,并且该iframe中的脚本正确地引用了该域的localStorage(正如我在console.log(localStorage)行中看到的那样),写入localStorage的权限仍然来自最上面的页面的域


简而言之,在Chrome中似乎没有iframe可以写入本地存储。有人知道有没有办法绕过这个特殊的安全“功能”?还是我做错了什么?

嗯,
localStorage
是基于域的,没有理由让示例代码失败。它实际做的是将127.0.0.1的
test
项设置为123,而将本地主机
localStorage
保留为空

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


我认为Chrome的配额是2.5mb,不像FF有5mb的本地存储配额。

只有在禁用第三方cookie时才会出现问题。Firefox和Opera的新版本也在阻止它。在IE和Edge中,尽管禁用了第三方cookie,但仍然可以使用。如果本地存储不会在iframe中被阻止,那么web跟踪器可以简单地包括一个iframe,读取cookie,将其发送到父脚本,然后将其发送到服务器

IE和Edge中未阻止此操作的原因是,这些浏览器允许网站向服务器发送以前设置为第一方cookie的第三方cookie,尽管第三方cookie被阻止。例如,如果用户定期访问facebook,他会从facebook获得第一方cookies。当他使用facebook的共享按钮访问其他网站时,facebook可以跟踪他,尽管第三方cookie被禁用。我真的不知道为什么IE和Edge不阻止第三方cookie发送,但无论如何我都不会使用这些浏览器

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

Chrome和Opera:
Uncaught DomeException:无法从“窗口”读取“localStorage”属性:拒绝访问此文档。

Firefox:
SecurityError:操作不安全。

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


因此,总之,不可能绕过此安全功能(在Chrome、Firefox、Opera中),这对于确保用户的隐私是很好的。

这是一篇老文章,但如果其他人看到它,您可以使用postMessage


注意,我还检查了localhost和127.0.0.1的localStorage对象,并保证它们为空,因此我知道“配额超出”错误确实是错误的;我当然没有超过5MB的配额。你解决了这个问题吗?我也收到了同样的邮件。。。正如Zvi Redler所说,您是否尝试过使用HTML5 postMessage使用IFRAME在您的两个来源之间进行通信?您需要一个侦听器和一个对postMessage的调用。请告诉我们你发现了什么。即使在匿名模式下,我也会得到同样的错误。即使Chrome的配额是2.5MB,我也不可能接近这个数字;我已经在Chrome上测试了你的代码,没有任何问题,你能发现你的代码发生了什么吗?这仍然相关吗?chrome默认会这样做吗?