【问题标题】:Local Storage Cross Domain - Safari disables it by default本地存储跨域 - Safari 默认禁用它
【发布时间】:2016-11-29 18:30:00
【问题描述】:

问题

我用过Ofir Dagan的github项目:Storing cross domain local storage。

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


问题

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

Safari 隐私偏好是:

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

我读到了这些设置:

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

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

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

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


我尝试过的解决方案

带有 iframe(像素)的本地存储 - 我认为它不再适用于 Safari - Is there any workaround to set third party cookie in Iframe for safari?


我认为有一种方法可以在 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 和本地存储。那是不同的东西。 Cookies 根本与本地存储无关。因此,如果您使用本地存储,cookie 处理策略不会导致本地存储出现任何问题。
  • 我知道Cookies和本地存储是不同的。但是当我更改为:“始终允许”时,本地存储是从跨域读取的。我猜本地存储与“和网站数据”有关。我可以给你发一个例子..(将数据存储在站点 X 的本地存储中,然后转到站点 Y 尝试读取数据)。
  • 此行为在哪个 Safari 版本中发生了变化?
  • 首选项在 V8 中已更改..

标签: javascript html safari cross-domain local-storage


【解决方案1】:

正如Cross-Storage library documentation所指出的:

关于 Safari 7+(OSX、iOS)的注意事项

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

【讨论】:

    【解决方案2】:

    你可以试试Store.JS。根据文档:

    store.js 公开了一个用于跨浏览器本地存储的简单 API

    【讨论】:

    • store.js 是否可以跨域工作?我看到它在哪里说跨浏览器,但没有看到任何对跨域的引用(这是非常不同的)。
    • 如果有人想知道这对 Safari 跨域不起作用。因此,如果您的顶级域是 site-a.com 而您的 iframe 是 site-b.com,则 site-b 的数据将被擦除。
    • 由于这是一个公认的答案,我假设您的问题已经解决。但是当我访问Store.js时,它只是用于存储,并没有提及跨域存储访问。您能否详细说明您是如何解决此问题的?
    • 我不明白为什么这被接受为答案。 Storejs 没有解决跨域存储问题。
    猜你喜欢
    • 2014-04-29
    • 2016-03-01
    • 2022-10-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2011-01-24
    • 2017-01-02
    • 2017-10-22
    相关资源
    最近更新 更多