leo*_*ntx 15 javascript safari persistence facebook local-storage
我们有一个在Facebook上运行的网络应用程序(即在不同域的iFrame中运行).如果Safari用户将Cookie和网站数据设置为默认值"允许来自我访问的网站",我们通过localStorage.setItem存储的数据就像sessionStorage一样,即它在用户当前会话之外不可用(即在用户关闭后)标签).如果我们将设置更改为"始终允许",则可以像Chrome,IE等一样正常工作
作为测试,我们已经尝试直接将浏览器导航到我们应用的域名(https://ourappname.appspot.com),并且在那里工作正常.此外它应该是一个真正的访问网站,但当回到Facebook内的游戏时,问题仍然存在.
请注意,setItem调用是成功的,只是getItem在后续会话中不返回任何内容.(因此,当用户进行私密浏览并且setItem调用本身因配额超出错误而失败时,就不一样了.)
我们需要做些什么来支持Safari,以便我们的应用程序在Facebook中运行,可以按照预期使用localStorage,数据在会话之间存活?
小智 8
这可能是Safari中的错误或安全功能.
您正在访问FaceBook而不是您的网站.您的应用程序位于iframe中,如果它允许您从浏览器中读取任何数据,则会违反安全模型.想想竞争对手的网站是否读取了它确实/未设置的数据.这构成了信息泄露.
在这方面,Safari正在做好它的工作.
理想情况下,在"允许从我访问的网站"模式中,没有浏览器应该让iframe将数据设置为localStorage; 即使每个域都有自己的存储沙箱.
令我感到不安的是他们为什么甚至让你从iframe写入localStorage(在你的'仅允许我访问的网站'模式中)?这可能实际上是一个错误 - 一个信息欺骗攻击启用bug.
我认为这是因为在不同方请求来源的情况下,从localStorage中删除了安全性异常.所以Safari实际上可能不会抛出错误,但让它无声地失败(在某些情况下).这可能就是你的setItem调用成功的原因.
在这一点上,根据给定的信息,我怀疑,先生,由于Safari程序员遵循标准的信件,你运气不好.
我仍在等待苹果的回复,但可以肯定地说我们一直坚持这种行为。所以阿努巴夫的答案是准确的,但我们仍然需要一个解决方案。
因此,作为解决方法,我们在服务器上创建了新端点来保存/恢复游戏状态。我们仅将其用于 Safari,对于所有其他浏览器,我们仍然将游戏状态保存在 localStorage 中。
对用户来说,性能会受到轻微影响。并且服务器成本很小。这不是一个性感的解决方案,但现在我们的 Facebook 画布应用程序支持 Safari。
| 归档时间: |
|
| 查看次数: |
2026 次 |
| 最近记录: |