跨域 cookie - 一个可能的新想法

Posted

技术标签:

【中文标题】跨域 cookie - 一个可能的新想法【英文标题】:Cross-domain-cookies - a maybe new idea 【发布时间】:2013-04-17 16:31:37 【问题描述】:

我的好友 Carsten Lau 提出了一个关于如何读取跨域 cookie 的有趣想法。

情况:您想从域“A”读取在域“B”上设置的 cookie。 想法:从域“A”上的客户端,您对域“B”上的动态资源执行获取请求 – f.e.一个图像或 javascript,它在服务器“B”上实际上是一种能够读取 php、Java 等 cookie 的编程语言。通过该请求,您发送一个唯一标识符,如会话 ID。因此,查看域“A”上站点的客户端上的代码可能如下所示:

<img src="www.domainB.com/?getCookie.php?sessionID=1234">

现在有趣的部分来了,服务器 B 在服务器端读取域“B”设置的 cookie,并使用提供的会话 ID 将结果写入域“A”可访问的 DB 中,或者返回包含的响应将 cookie 信息发送到域“A”上的客户端,然后通过 AJAX 将其发送到服务器“A”。

我很确定存在我们尚未发现的缺陷。我个人认为服务器“B”将无法读取 cookie 信息,因为客户端浏览器 URL 指向域“A”,但当然上面解释的“getCookie”请求指向“B”。

请告诉我们您对此的看法、它为何有效或为何无效。让我大吃一惊的是,一个小小的概念证明是成功的。

【问题讨论】:

这应该可以。事实上,这就是网站处理来自不同域的用户登录的方式,因为这些域共享包含会话数据的数据库。 谢谢。在互联网上的任何地方和 SO 上,您都可以阅读“跨域 cookie = 不可能”,而事实上,如果您拥有两个域并且可以在域“B”上添加一个小脚本,那么简单的 hack 就可以实现?奇怪... 这没什么好奇怪的。您不是在此处为不同的域读取或设置 cookie - 这 仅来自您的域是不可能的。如果您有来自其他域的“帮助”,则几乎没有“跨域”——您是从其他域选择获取信息;而跨域策略已到位,以防止在其他域不希望发生的情况下发生这种情况。 如何让这个 cookie 数据在我的 php 中可用? 现在我们有一个 ietf 草案(所谓的“SameSite”属性)来禁止这种行为:tools.ietf.org/html/draft-west-first-party-cookies-07 【参考方案1】:

我整理了一个 NPM 包来帮助跨域 cookie/localStorage 使用。我知道这篇文章有点老了,但我想我会分享一下,以防其他人需要帮助:

https://www.npmjs.com/package/cookie-toss

通过使用托管在域 A 上的 iframe,您可以将所有用户数据存储在域 A 上,并通过向域 A iframe 发布请求来引用该数据。

因此,域 B、C 等可以注入 iframe 并向其发布请求以存储和访问所需的数据。域 A 成为所有共享数据的中心。

通过域 A 内的域白名单,您可以确保只有您的依赖站点才能访问域 A 上的数据。

诀窍是将代码放在域 A 上的 iframe 内,该代码能够识别正在请求的数据。上述 NPM 模块中的 README 更深入地介绍了该过程。

希望这会有所帮助!

【讨论】:

【参考方案2】:

这是正常的,因为您可以控制这 2 个域。顺便说一句,大多数网站都是这样实现跨域单点登录的。但是,如果您无法控制第二个域,则无法从中读取 cookie。

【讨论】:

当然,你是对的,但在大多数情况下,当你在寻找设置跨域 cookie 时,总是有简单(和错误)“不可能”的答案。如果您同时拥有这两个域,则完全没有问题。

以上是关于跨域 cookie - 一个可能的新想法的主要内容,如果未能解决你的问题,请参考以下文章

关于Android的okHttp+webview的cookie跨域问题

js cookie跨域

利用nginx解决cookie跨域

使用 FormsAuthentication 的跨域 Cookie

ajax 跨域无法携带cookie 解决办法

Cookie 未在 Chrome 跨域发布中发送