网页的隐式跨多域 Cookies 的方法探讨,在 Safari 上面似乎路径都已经被堵死

2018-12-25 11:41:36 +08:00
 lhx2008

对于以下场景: 有 API 服务器 a.com ,同一个用户在 b.comc.com 调用 a.com 的 API 的时候,a.com 可以识别到这是同一个用户。

或者说,在 b.com 登录 a.com 之后,c.com 访问 a.com 的 API 也是登录状态。

如果浏览器没有开启第三方 Cookies 保护,有以下这些隐式的方法:

  1. CORS, withCredentials
  2. Iframe 设置 Cookies
  3. Iframe 使用 postMessage
  4. 古老的 P3P 头,已经被淘汰

如果浏览器开启了禁止 第三方 Cookies,对于一些浏览器,上述的第三个仍然可以使用,但是 Safari 均不行。而且 Safari 默认禁止第三方 Cookies,如果需要用户开启,这也看作是 显式 的方法。

在禁止第三方 Cookies 的情况下,Facebook 以前使用了一种浏览器指纹的技术进行隐式追踪,来识别用户,这对于大多数浏览器仍然可行,但是苹果今年在开发者大会上面说,“我们只提供了一个简化的系统配置,因此,你的 Mac 看起来更像其他所有人的 Mac 电脑,而数据公司要想识别你的设备并追踪你,将会变得更加困难”,说明,这个路径也被堵死了。

另外,还有一些是可行的跨多域方法,但是都是显式的,我列出来,以免大家回复的时候误会

  1. b.comc.com跳转a.com 设置 cookies,再跳转回来
  2. 使用小弹窗的方式设置 Cookies
  3. Storage Access API,在 Safari 上会弹出一个用户授权框,需要用户显式授权
  4. 让用户修改浏览器设置,允许第三方 Cookies

当然,为了防止还是有人出来杠我,我再提一下 jsonp, 普通 CORS, localstoragedocument.cookie,这些虽然是隐式的,也可以做所谓的跨域,但是不能跨多域,在 b.com 获取到的 token/cookies,c.com 不知道,在 c.com 仍然需要重新获取 token

4091 次点击
所在节点    分享发现
22 条回复
xiaochocking
2018-12-25 17:09:02 +08:00
@lhx2008 soga 我好像搞混了保存 cookie 的主体了,不是 a.cob.co 设置的 cookie,应该是 a.co 给浏览器设置的 cookie
gonghao
2018-12-26 11:45:14 +08:00
@lhx2008 a.com 的 cookie 是设置成功的,在 a.com 上面的请求也是正常 OK 的。但是在 b.com 上跨域请求 a.com 就是失败,CORS 也是正确的,就唯独 Safari 下不行。但只要把 Prevent cross-site tracking 关闭就是可以了。挂一个 iframe 用 postMessage 这个方法还真没试过,成本要高不少,但是确实可以避免敏感信息泄露给 JS 的危险

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/520756

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX