我们有一个在Facebook上运行的网络应用程序(即在不同域的iFrame中运行)。如果Safari用户将Cookie和网站数据设置为默认值“允许来自我访问的网站”,我们通过localStorage.setItem存储的数据就像sessionStorage一样,即它在用户当前会话之外不可用(即在用户关闭后)标签)。如果我们将设置更改为“始终允许”,则可以像Chrome,IE等一样正常工作
作为测试,我们已尝试直接将浏览器导航到我们应用的域名(https://ourappname.appspot.com),并且可以在那里正常运行。此外它应该是一个真正的访问网站,但当回到Facebook内的游戏时,问题仍然存在。
请注意,setItem调用是成功的,只是getItem在后续会话中不返回任何内容。 (因此,当用户进行私密浏览并且setItem调用本身因配额超出错误而失败时,就不一样了。)
我们需要做些什么来支持Safari,以便我们的应用程序在Facebook中运行,可以按照预期使用localStorage,数据在会话之间存活?
答案 0 :(得分:8)
这可能是Safari中的错误或安全功能。
您正在访问FaceBook而不是您的网站。您的应用程序位于iframe中,如果它允许您从浏览器中读取任何数据,则会违反安全模型。想想竞争对手的网站是否读取了它确实/未设置的数据。这构成了信息泄露。
Safari正在这方面做得很好。
理想情况下,在“允许从我访问的网站”模式中,没有浏览器应该让iframe将数据设置为localStorage;即使每个域都有自己的存储沙箱。
令我不安的是,为什么他们甚至让你从iframe写入localStorage(在你的'仅允许我访问的网站'模式中)?这实际上可能是一个错误 - 一个信息恶搞攻击,可以启用bug。
我认为这是因为在不同方请求来源的情况下,从localStorage中删除了安全例外。所以Safari实际上可能不会抛出错误,但让它无声地失败(在某些情况下)。这可能就是你的setItem调用成功的原因。
此时,根据给定的信息,我怀疑,先生,由于Safari程序员在standard之后发信,你运气不好。