本地存储跨域 - Safari 默认禁用

16

问题:

我使用了Ofir Dagan的Github项目:存储跨域本地存储。

它实现了html5本地存储:https://github.com/ofirdagan/cross-domain-local-storage


问题所在:

Safari默认情况下不允许第三方cookie(其他浏览器允许)。

Safari隐私设置为:

enter image description here

默认设置为:“仅允许来自我访问的网站”。

我阅读了有关这些设置的信息:

  1. 始终阻止 - 阻止所有第一方cookie和所有第三方cookie。

  2. 仅允许当前网站 - 允许所有第一方cookie并阻止所有第三方cookie。

  3. 允许我访问的网站 - 允许所有第一方cookie,并阻止所有第三方cookie,除非该第三方曾经是第一方(基于当前cookie和浏览历史记录)。

  4. 始终允许 - 允许所有第一方cookie并允许所有第三方cookie。


我尝试过的解决方法:

使用iframe(像素)进行本地存储 - 我认为在Safari上已经不再起作用 - 有没有办法在Safari中为Iframe设置第三方cookie的解决方法?


我认为在Safari上有一种方法可以在第一方和第三方站点之间共享本地存储。(Facebook.com和Booking.com在不同的域之间共享数据)。

我通过删除API并亲自编写它来实现了这一点,但我不想删除API并亲自实现它(希望能有一个小修复来支持Safari):

Iframe.html

window.addEventListener('cors_event', function(event) {
    if(event.event_id === 'my_cors_message'){
        if (event.data.options.funcName == "SetItem") {
            localStorage.setItem(event.data.options.key, event.data.options.value);
        }
        else if (event.data.options.funcName == "GetItem") {
            return localStorage.getItem(event.data.options.key);
        }
    }
});

MainPage:

主页:
<iframe id="target" src="iframe.html" frameborder="1"></iframe>

<script>

    var target = document .getElementById('target');
    target.onload = function(){
        target.contentWindow.postMessage('set', '*')
    }
</script>

那么有人知道我如何通过改变一些API逻辑来支持Safari吗?

非常感谢任何帮助!


不要混淆Cookie和本地存储。它们是不同的东西。Cookie与本地存储没有任何关系。因此,如果您使用本地存储,Cookie处理策略不会对本地存储造成任何问题。 - hindmost
我知道Cookies和本地存储是不同的。但是当我改为“始终允许”时,跨域从本地存储中读取。 我猜测本地存储与“网站数据”有关。我可以给你一个例子。(将数据存储在X网站的本地存储中,然后转到试图读取数据的Y网站)。 - Alon Shmiel
1
这种行为是在哪个Safari版本中改变的? - mash
1
偏好设置在V8中已更改。 - Alon Shmiel
3个回答

16

Cross-Storage库文档所述:

关于Safari 7+(OSX,iOS)的注释

Safari 7+默认禁用所有跨域本地存储访问。这是由于“阻止来自第三方和广告商的cookie和其他网站数据”隐私设置被设置为该选项。任何跨域存储客户端代码不会崩溃,但是它只能访问沙箱、隔离的本地存储实例。因此,先前由其他来源设置的数据将无法访问。如果可以的话,用户代理可以回退到使用根cookie,或请求从服务器端存储中获取数据。


0
似乎最近Safari浏览器的更新(防止跨站点跟踪)会在Matomo域与加载网站不匹配时阻止生成任何cookie。
这破坏了使用需要设置cookie的Matomo iFrame的功能(例如logme功能)。
目前看来没有使用标头(例如使用CSP或CORS配置)来修复此问题的方法。
目前已经存在一些解决方法,我找到的有:
  1. 在隐私设置中禁用“防止跨站点跟踪”设置
  2. 将访问者重定向到iFrame外部页面以设置cookie,此后只要CORS配置正确且浏览器没有完全阻止iFrame加载,则iFrame可以加载。
我不确定有多少用户正在使用需要设置cookie的iFrame,但如果他们的用户使用Safari,他们将受到影响。

-2
你可以尝试使用Store.JS。根据文档所述:

store.js为跨浏览器本地存储提供了一个简单的API


8
store.js能够跨域工作吗?我看到它说它可以跨浏览器使用,但没有提到跨域(这是非常不同的)的任何参考资料。 - Tim Ramsey
4
如果有人想知道,这在Safari中不适用于跨域。因此,如果您的顶级域是 site-a.com ,而您的iframe是 site-b.com,则 site-b 的数据将被清除。 - anthony-dandrea
既然这是一个被接受的答案,我会假设你的问题已经解决了。但是当我访问Store.js时,它只是用于存储,并没有提到跨域存储访问。你能否详细说明一下你是如何解决这个问题的? - Amitkumar Jha
9
我不明白为什么这个被接受为答案。Storejs不能解决跨域存储问题。 - h--n

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接