网页的隐式跨多域 Cookies 的方法探讨,在 Safari 上面似乎路径都已经被堵死 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lhx2008
V2EX    分享发现

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

  •  3
     
  •   lhx2008 2018-12-25 11:41:36 +08:00 4417 次点击
    这是一个创建于 2483 天前的主题,其中的信息可能已经有所发展或是发生改变。

    对于以下场景: 有 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

    第 1 条附言    2018-12-25 15:03:40 +08:00
    Safari 的策略好像更严格,一般做法好像是先显式设置 a.com 上面的 cookie,然后 b.com 或者 c.com 再用 iframe postMessage 的方法拿到 a.com 上面的 cookies 信息。
    22 条回复    2018-12-26 11:45:14 +08:00
    martyartrt1
        1
    martyartrt1  
       2018-12-25 11:52:41 +08:00   1
    我有看到用 chrome 插件 和 服务器 进行同步 cookie 的
    gonghao
        2
    gonghao  
       2018-12-25 13:02:04 +08:00   1
    现在使用 b.coma.com 设置 Set-Cookie 可以顺利吧 a.com 的 Cookie 设置上,然后回到 b.com 。这时候如果在 b.com 用 CORS withCredentials 请求 a.com 的资源,其他浏览器下都是 OK,唯独 Safari 无解,除非去关闭 Prevent cross-site tracking。现在想到的唯一办法就是单独用 X-Auth 头来解决,但一直不愿意把 token 暴露到 JS 端,更不愿用 localStorage 或者 sessionStorage 去存储,所以现在就非常的纠结。
    lhx2008
        3
    lhx2008  
    OP
       2018-12-25 13:14:56 +08:00
    @gonghao 这样也不行吗,我其实没有苹果的机器,主要是看网上的文章说,只要是显式 set 都可以隐式读取。
    explon
        4
    explon  
       2018-12-25 13:20:25 +08:00   1
    除了 script 标签调用文件通过 header 来种 cookie,其他方式应该都不行了
    lhx2008
        5
    lhx2008  
    OP
       2018-12-25 13:27:52 +08:00 via Android
    @gonghao 你这种情况好像还可以挂一个 iframe 用 postMessage,不知道行不行
    lhx2008
        6
    lhx2008  
    OP
       2018-12-25 13:28:51 +08:00 via Android
    @explon 但是种了也很难读到,像 2 楼说的
    lhx2008
        7
    lhx2008  
    OP
       2018-12-25 13:29:50 +08:00 via Android
    @explon safari 的策略太严格了
    Chingim
        8
    Chingim  
       2018-12-25 13:49:19 +08:00 via Android
    小弹窗应该被浏览器 block 吧,选项 2 也可以去掉了
    lhx2008
        9
    lhx2008  
    OP
       2018-12-25 14:01:45 +08:00 via Android
    @Chingim 不会的,点击那个链接上面的弹窗事件不会被 block,比如分享到微博啥的,我博客 https://luan.ma 的评论也是弹窗登录的,没问题
    ethusdt
        10
    ethusdt  
       2018-12-25 15:03:12 +08:00
    赞呀 !

    友情相关 : [t/520669]( t/520669)
    lhx2008
        11
    lhx2008  
    OP
       2018-12-25 15:28:36 +08:00 via Android
    @livid 我好像只置顶了 10 分钟,但是好像状态有两个小时?
    xiaochocking
        12
    xiaochocking  
       2018-12-25 15:46:41 +08:00
    @lhx2008 #6 很难读到的意思是?
    yksoft1
        13
    yksoft1  
       2018-12-25 15:51:51 +08:00
    WebSocket 可不可以连接到第三方?
    lhx2008
        14
    lhx2008  
    OP
       2018-12-25 16:07:21 +08:00 via Android
    @xiaochocking 如果关闭了第三方 cookies,即使你在 a.com 有 cookies,你在 b.com 用 cors 发请求到 a.com ,也不会把那个 cookies 带上
    rayhy
        15
    rayhy  
       2018-12-25 16:21:25 +08:00 via Android
    想问类似 Google analysis 这种产品也做不到识别多个网站的相同用户吗?如果能,它是怎么做到的?
    xiaochocking
        16
    xiaochocking  
       2018-12-25 16:38:56 +08:00
    @lhx2008 "在 b.com 获取到的 token/cookies,c.com 不知道,在 c.com 仍然需要重新获取 token",有 b.com 获取到 token,c.com 不用重新取的可能吗?浏览器不可能允许 c.com 请求 a.com 时带上 [a.comb.com 设置的 cookie]的吧,所以是不是最终都是得想方法各自获取 cookie 然后把他们关联起来(或者直接 cookie 值相等)?
    chinvo
        17
    chinvo  
       2018-12-25 16:39:24 +08:00 via iPhone
    @rayhy #15 他本质上是用的 Google.com 域名下的 cookie,并没有跨域读写
    lhx2008
        18
    lhx2008  
    OP
       2018-12-25 16:53:29 +08:00 via Android
    @xiaochocking 允许第三方 cookies 的话,cookies 是存到 a.co 那里,只要 a.co 允许的域名,b.co c.co cors 到 a.co ,用的都是 a.co 的 cookies。b.coc.co 不用存 cookies
    如果不允许的话,只能把 a.co 的内容以 json 拉到 b.co 或者 c.co ,再存在 b.co 或者 c.co 的域下面,这样是肯定不互通的。
    lhx2008
        19
    lhx2008  
    OP
       2018-12-25 16:55:33 +08:00 via Android
    @rayhy GA 好像没有做跨站追踪。但是 Google 肯定有,而且 chrome 本身也不会把第三方 cookies 关闭,而且还给自己设置的 cookies 开后门不让你清除。
    lhx2008
        20
    lhx2008  
    OP
       2018-12-25 16:59:47 +08:00 via Android
    跨站追踪用那个 iframe 的方法就可以做,大网站因为你访问过,所以在非 iframe 显式设置的 cookies,在别的网站用 iframe 可以隐式读到( postMessage ),比如在嵌入 GGAD 的网站,所以可以跟踪你的网络请求。所以我觉得这就是他们给大公司开的后门吧,哈哈
    @rayhy
    xiaochocking
        21
    xiaochocking  
       2018-12-25 17:09:02 +08:00
    @lhx2008 soga 我好像搞混了保存 cookie 的主体了,不是 a.cob.co 设置的 cookie,应该是 a.co 给浏览器设置的 cookie
    gonghao
        22
    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 的危险
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2992 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 00:33 PVG 08:33 LAX 17:33 JFK 20:33
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86