在 Safari 中设置跨域 cookie

IT技术 javascript safari cookies cross-domain cross-site
2021-01-16 05:22:34

我必须从域 B.com 调用域 A.com(用 http 设置 cookie)。我在域 B.com 上所做的只是(javascript):

var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.src = "A.com/setCookie?cache=1231213123";
head.appendChild(script);

这会在我测试过的每个浏览器上的 A.com 上设置 cookie,除了 Safari。令人惊讶的是,即使没有 P3P 标头,这也适用于 IE6。

有什么办法可以在 Safari 中完成这项工作吗?

6个回答

来自Safari Developer FAQ

Safari 附带了一个保守的 cookie 策略,该策略将 cookie 写入仅限于用户选择(“导航到”)的页面。此默认保守策略可能会混淆尝试写入 cookie 并失败的基于框架的站点。

我没有找到解决这个问题的方法。

如果值得的话,如果您使用<script> 附加方法,Chrome 也不会设置 cookie ,但是如果您有一个隐藏的<img> 具有相同的来源,Chrome 会与其他浏览器一起工作(同样,Safari 除外)

知道 evernote.com 是如何做到的吗?他们使用 iframe 作为书签,它能够以某种方式设置 cookie。
2021-03-14 05:22:34
如果我知道我会告诉你......重点是它可能看起来像它的工作,但他们显然在幕后做其他事情。您无法使用默认设置在 Safari 上设置第三方 cookie。就这么简单。
2021-03-18 05:22:34
它被投票通过,因为它是正确的答案,如果不将整页重定向到第三方域,您就无法在 Safari 中执行您的请求。
2021-03-25 05:22:34
好吧,我之前已经多次研究过这个问题,也许他们给人一种它有效的错觉,但我 99.9% 的人认为,除非更改安全设置,否则 Safari 不会设置 cookie。
2021-04-09 05:22:34
你确定印象笔记做到了,而不是你改变了默认的 Safari 设置?
2021-04-12 05:22:34
它确实有效,但您不能通过 javascript 创建 cookie,它必须由服务器在表单的响应中创建。+1
2021-03-15 05:22:34
@streetlight - 你是对的,那篇博文的作者在这里确认这不再有效: anantgarg.com/2010/02/18/cross-domain-cookies-in-safari/...
2021-03-19 05:22:34
在我的印象中,在整个“Google 为广告而黑掉 Safari”之后,Webkit 中的这个漏洞已经被堵住了
2021-04-11 05:22:34

这可能不适用于所有人,但我遇到了这个问题,因为我从与 API 不同的主机提供 React 应用程序,最终有效的解决方案是使用 DNS:

我们的客户从 www.company-name.com 获得服务,我们的 API 位于 company-name.herokuapp.com。通过创建CNAME记录 api.company-name.com --> company-name.herokuapp.com,并让我们的客户端使用该子域进行 API 调用,Safari 不再将其视为“第三方”cookie。

好处是涉及的代码很少,而且都使用完善的东西......缺点是如果你要使用 https,你需要对 API 主机进行一些控制/所有权 - 他们需要一个有效的证书对于客户端域,否则用户将收到证书警告 - 因此,如果有问题的 API 不是您的或合作伙伴的,这将不起作用(至少不适用于面向最终用户的 API)。

我我爱你。我正要重新开发我的整个身份验证系统,直到我发现了这个。
2021-03-16 05:22:34
这挽救了我的产品发布!太感谢了!
2021-03-22 05:22:34
这个答案对我有很大帮助,并解决了我的 Safari cookie 问题,谢谢。只是为了更具体地了解证书警告,SSL 证书应将客户端域列为列出的 SAN(主题备用名称),以使其正常工作。您将需要弄清楚如何与您的证书提供商一起执行此操作。
2021-04-09 05:22:34

2014-2016年工作方法:

您必须对域执行 window.open / 分配 cookie / 关闭弹出窗口,域现在已列入安全名单。

原帖@ PHP 多个 cookie 不适用于 iPad / iPhone 浏览器

此页面上的代码对此非常有用measurablewins.gregjxn.com/2014/02/...
2021-03-14 05:22:34

假设他们安装了闪存,有一些邪恶的伎俩。

我不确定它是否仍然有效,但 Flash 的“本地共享对象”又名Flash Cookie可以帮助您绕过 Safari 的同域策略。

本地共享对象教程

但是,至少可以说,实施起来可能很复杂。

此外,LSO 正在成为安全噩梦:

所以在使用它们之前要仔细考虑。

嘿肯特,是的,这是我认为的解决方案,使用 flash 对象...我希望我能给你正确的答案,但它被卡住了:(
2021-04-01 05:22:34