2015-07-10 87 views
15

我们有一个在Facebook上运行的Web应用程序(即运行在不同域的iFrame中)。如果Safari用户的Cookie和网站数据设置为默认值“允许来自我访问的网站”,我们通过localStorage.setItem存储的数据就像sessionStorage一样行事,即它在用户当前会话之外不可用(即在用户关闭后该选项卡)。如果我们将设置更改为“始终允许”,就像Chrome,IE等一样工作正常。Safari localStorage在会话之间不会持久

作为一项测试,我们尝试直接浏览器到我们的应用程序域(https://ourappname.appspot.com),它工作正常那里。而且它也应该是一个真正的访问过的网站,但是当回到Facebook的游戏时,问题依然存在。

请注意,setItem调用成功,只是getItem不会在后续会话中返回任何内容。 (因此,当用户为Private Browsing且setItem调用本身失败并且出现Quota Exceeded错误时,它不会如此)。

我们需要做些什么来支持Safari,以便我们在Facebook上运行的应用程序可以使用localStorage作为意图在哪些数据将在会话之间生存?

+0

奇怪的是,我刚刚在Safari 8.0.7(10600.7.12)中测试了“允许我访问的网站”。我设置了一个localStorage密钥,然后关闭浏览器(使用⌘+ Q),当我重新打开浏览器并使用localStorage.getItem时,它就在那里。 – daviddoran

+0

@daviddoran谢谢。您是否测试了与顶级网站不同的iFrame中运行的网站?我会编辑我的问题,使其更清楚。 – leontx

回答

3

我还在等待苹果的回复,但可以肯定地说我们坚持这种行为。所以Anubhav的回答是准确的,但我们仍然需要一个解决方案。

因此,为了解决这个问题,我们在服务器上创建了新的端点以保持/恢复游戏状态。我们只在Safari上使用它,对于所有其他浏览器,我们仍然在localStorage中保持游戏状态。

用户有轻微的性能损失。而且服务器的成本很低。不是一个性感的解决方案,但现在我们的Facebook画布应用程序支持Safari。

+0

你有没有听过吗?我也遇到过这个问题。我的场景非常相似(iFrame等)。 –

+2

@WesleyWorkman自发布此答案和我的评论以来没有新信息。这是我们的解决方法,并且已经投入生产了几个月,并且工作正常。 – leontx

7

这是一个Safari或一个安全功能的错误。

您正在访问FaceBook,而不是您的网站。您的应用在iframe中,如果它允许您从浏览器读取任何数据,就会违反安全模型。考虑一下竞争对手的网站是否读取了它确实/没有设置的数据。这会构成信息泄露。

Safari在这方面做得很好。理想情况下,在“允许从我访问的网站”模式下,浏览器不应让iframe将数据设置为localStorage;即使每个域都有自己的存储沙箱。

让我感到困扰的是为什么他们甚至让你从iframe中写入localStorage(在你的“只允许访问的网站”模式下)?这实际上可能是一个错误 - 一个信息欺骗攻击使得错误。

我认为这是因为安全性异常从本地存储丢弃,如果请求不是同方来源。因此,Safari实际上不会抛出错误,而是让它静静地失败(在某些情况下)。这可能是你的setItem调用成功的原因。

在这一点上,根据给定的信息,我怀疑,先生,由于Safari程序员跟着standard致信,所以你不走运。

+0

谢谢你的深思熟虑的答案。看起来,如果用户直接导航到我们的网站,那么我们的网站将启用读取/写入localStorage。这部分似乎也可能是一个错误?我的主要问题是我们需要做什么......如果您知道任何解决方法,请告诉我。我认为大多数Facebook的画布应用程序必须找到解决这个问题的一些办法? – leontx