为什么苹果要完全屏蔽第三方 Cookie? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
milklee
V2EX    分享创造

为什么苹果要完全屏蔽第三方 Cookie?

  •  
  •   milklee 2020-03-26 16:19:39 +08:00 5216 次点击
    这是一个创建于 2116 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天看到一个消息,说是苹果要完全屏蔽第三方 Cookie,看到之后感触良多,于是我写了一篇文章解释了下苹果为什么要这么做,在这里分享一下:

    https://github.com/lmk123/blog/issues/76

    欢迎大家提出自己的观点
    第 1 条附言    2020-03-26 19:18:59 +08:00

    贴一下原文给打不开 GitHub 的朋友


    最近在面试候选人的时候,我一定会问一个问题:a.com 里的 Javascript 发起了一次获取数据的请求到 b.com 的接口,那么这次请求浏览器携带的是 a.com 的 Cookie 还是 b.com 的 Cookie?大部分人都回答了 a.com,但这是错误的浏览器携带的永远是请求接收方的 Cookie,不然的话 b.com 岂不是获取了 a.com 所有的 Cookie 数据?

    无独有偶,今天刚好关注到一个消息,苹果 WebKit 博客发表了一篇题为《Full Third-Party Cookie Blocking and More》的文章,正式宣布将在 iOS、iPad OS 13.4 和 macOS 上的 Safari 13.1 里默认完全屏蔽第三方 Cookie。

    文章里提到了这样做有这些好处:

    • 使跨站点泄露用户信息(例如登录指纹)不再可行
    • 禁用通过第三方请求对网站的跨站点伪造攻击
    • 删除使用辅助第三方域标识用户的功能。否则,即使用户删除第一方的网站数据,此类设置也可能保留 ID

    本文不打算评价这种做法的对错,只是想从技术的角度解释为什么禁用第三方 cookie 会有文章里提到的这些好处。

    什么是第三方 Cookie?

    在这之前,我们先简单解释一下什么是第三方 Cookie。

    HTTP 协议是无状态的,但如果要保存用户的登陆状态,网站肯定需要将用户的唯一标识存储在浏览器里,于是有了 Cookie。当用户访问一个网站,并输入用户密码登陆之后,网站会在浏览器里存储一个唯一标识,下次用户再打开这个网站时,这个唯一标识会被浏览器发送到网站的服务器,这样网站就知道,这个用户之前已经登陆过了,不需要再输入用户名和密码了。

    但是,文章里说到的第三方 Cookie 是什么?

    举个例子,我打开了网站 a.com,这个网站在我的浏览器里写入了一些 Cookie 用于记录我的登陆状态,但同时,a.com 的 HTML 里引用了第三方网站的资源,比如 b.com 下的一张图片、c.com 下的一个脚本文件,这些第三方服务器在返回资源的同时,也可以给浏览器设置它们域下的 Cookie,最终导致的结果就是,虽然我只访问了 a.com,但我的浏览器里现在有了 a.comb.comc.com 三个域的 Cookie。

    在这三个域的 Cookie 中,a.com 属于第一方 Cookie,因为我访问的就是 a.com,但 b.comc.com 的 Cookie 就属于第三方 Cookie 了。

    了解了什么是第三方 Cookie 之后,我们再来逐条解释一下文章里说的好处分别说的什么意思。

    第 2 条附言    2020-03-26 19:20:06 +08:00
    ## 什么是“跨站点泄露用户信息”?

    一般网站的登陆流程是这么设计的:假设我的网站是 a.com ,在首页点击登陆之后,浏览器会跳到另一个地址 `a.com/login.html?redirect=https%3A%2F%2Fa.com`,当我们登陆成功之后,浏览器会跳转回 a.com ,也就是 URL 中 redirect 指定的地址;如果用户已经登陆过 a.com ,再次打开 `a.com/login.html?redirect=https%3A%2F%2Fa.com` 时,就会自动跳转到首页。

    这是目前网站登陆中很常见的一个操作,但也成为了第三方网站检测你是否登陆过 a.com 的方式。

    假设我们有一个网站 evil.com ,然后我们在 HTML 里引入这样一个 img:

    ```html
    <img src="a.com/login.html?redirect=a.com%2Ffavicon.ico" Onload="alert('登陆过')" Onerror="alert('没有登陆')>
    ```

    想象一下会发生什么?

    如果用户登陆过 a.com ,那么浏览器在请求 `a.com/login.html` 这个资源时,会把 a.com 的 Cookie 带过去,a.com 发现用户登陆过,就会跳转到 `a.com/favicon.ico`,最终浏览器成功加载了这个 ico 图片,于是 `onload` 执行了。

    如果用户没有登陆过 a.com ,那么 `a.com/login.html` 会返回一段 HTML,但浏览器需要的是图片,于是 `onerror` 执行了。

    也就是说,通过这种方式,任何一个网站都知道我们有没有登陆过 a.com 。注重安全的网站会针对这种情况,屏蔽第三方网站对自家资源的请求,但并不是所有网站都会意识到这个问题。

    如果默认屏蔽了第三方 Cookie,那么访问第三方网站时,浏览器不会带上 Cookie,所以从第三方网站访问 a.com/login.html 只会返回 HTML,这样就能从根本上阻止这种窃取隐私的行为了,不需要网站站长们自己去解决这个问题。

    ## “通过第三方请求对网站的跨站点伪造攻击”是指什么?

    假设你登陆了一个银行网站 bank.com ,这个网站有一个接口,可以让你把你的钱转给其他账号,例如当你在浏览器里打开 `bank.com/transfer?amount=10&user=mica` 这个地址后,银行就会把 10 块钱转账给 mica 这个用户,当然,前提是你已经登陆过你的账号。

    现在,有一个恶意网站 evil.com ,它在 HTML 中用 iframe 引入了银行网站的这个转账接口:

    ```html
    <iframe src="bank.com/transfer?amount=10000&user=evil" />
    ```

    于是你每访问一次 evil.com ,都会在你毫不知情的情况下给某个人转账 10000 块钱。

    evil.com 当然没有你的用户名和密码,但由于你已经登陆过 bank.com ,所以浏览器里有你在 bank.com 的登陆标识 Cookie,而即使是第三方网站在访问 bank.com ,浏览器也会带上你的登陆标识,所以 bank.com 会认为这是你发出的指令,于是就产生了这种不需要账号就能造成损失的攻击方式。

    这种攻击方式有一个专业上的术语叫 CRSF ( Cross-site request forgery ),跨站请求伪造。同样的,注重安全的公司会阻止第三方网站调用自己的接口,但并不是所有网站都会这么做。

    如果默认禁用了第三方 Cookie,在上面的场景中,从 evil.com 里发起的对 bank.com 的请求就不会带上你的登陆标识 Cookie,自然 bank.com 也就不会执行转账的操作了。
    第 3 条附言    2020-03-26 19:21:02 +08:00

    “删除使用辅助第三方域标识用户的功能”是指什么?

    场景一:共享登陆状态

    现在大家可能都喜欢在淘宝和天猫上购物,不知道有没有注意到,我在天猫 https://tmall.com 登陆之后,再打开淘宝 https://taobao.com 的时候不需要重新登陆,淘宝已经知道我是谁了。

    我们都知道,不同域名的网站相互之间是不能读取对方的 Cookies 的,那天猫和淘宝是怎么做到共享登陆状态的?其实就是利用了第三方 Cookie 的特点。

    天猫的登陆界面 https://login.tmall.com 其实是用 iframe 引用了淘宝的登陆界面 https://login.taobao.com ,登陆成功之后,淘宝在浏览器里写入了 .taobao.com 域的 Cookie,所以用户打开淘宝的时候,浏览器里已经有了淘宝的登陆标识,淘宝当然就知道我们是谁了。

    这就是“使用辅助第三方域标识用户的功能”了等等,后面那句“即使用户删除第一方的网站数据,此类设置也可能保留 ID”是指什么?

    假设现在我想清除我在天猫的所有数据,包括 Cookies。在 macOS 的 Safari 浏览器中,你可以打开偏好设置,切换到「隐私」这个标签页,点击「管理网站数据...」按钮,然后在弹出的窗口中搜索 tmall.com,选中之后,点击左下角的「移除」,这样天猫的所有数据都被清除了。

    按照预期,我再打开天猫应该是未登陆的状态但实际上并不是,我打开之后,天猫仍然知道我是谁,我的登陆状态仍然没有被清除。

    原因就是,我清除了天猫的数据,但没有清除淘宝的数据,而我的登陆状态是保存在淘宝里的但这显然不符合用户的预期。

    在苹果默认禁用第三方 Cookie 之后,这样的登陆状态共享就做不到了,因为在天猫登陆的时候,浏览器会阻止淘宝把 Cookie 写入浏览器里。

    场景二:广告追踪

    站长们为了利用网站的流量变现,一般会选择给网站加点广告,自己找广告主很麻烦,所以站长一般会直接接入广告联盟,广告联盟会提供一个脚本文件给站长,只要引入了这个脚本,那么就能自动推荐合适的广告给用户。

    这听起来简单方便,合情合理,但如果有很多网站都引用了广告联盟的脚本文件呢?

    假设有一个广告联盟 ad.com,它提供了一个脚本文件 ad.com/get_ad.js,现在有两个网站 a.comb.com 都引用了这个脚本,那么会发生什么?

    用户第一次访问 a.com 的时候,ad.com 会通过 ad.com/get_ad.js 给用户设置一个 Cookie 到浏览器里,用于唯一标识这个用户;然后这个用户访问 b.com 的时候,浏览器加载 ad.com/get_ad.js 的脚本时会携带上刚才设置的 Cookie,这样广告联盟就能把这两次访问记录关联起来:我有一个用户 xxx,他先是访问了 a.com,然后访问了 b.com

    那如果有成千上万个网站都加入了 ad.com 这个广告联盟呢?恭喜,你在互联网的访问记录,ad.com 都知道的一清二楚了,而在技术如此发达的现在,将 Cookie 关联到你的个人信息一点也不难。

    如果禁用了第三方 Cookie,广告联盟就再也不能拿到我们的访问记录了,但与此同时,广告联盟也不能根据用户的访问记录向我们推荐合适的广告了,这对站长和广告联盟行业都是一个沉重的打击。

    总结

    第三方 Cookie 是一把双刃剑,它能为我们带来便利,但同时也会泄漏我们的隐私。Cookie 未来的走向如何,其实更多的是社会对于便利与隐私之间的取舍。

    10 条回复    2020-04-25 21:24:51 +08:00
    ylw
        1
    ylw  
       2020-03-26 19:27:55 +08:00
    主要还是隐私 微信 用户状态 探针 用的就是这个
    ylw
        2
    ylw  
       2020-03-26 19:28:56 +08:00
    第三方统计 js 也是 屏蔽对象 , 之前不是有 邮件不要点击查看邮件自带图片 也是基于这方面考虑
    FourAndHalf
        3
    FourAndHalf  
       2020-03-27 11:49:50 +08:00
    老哥你不要吓我,我司的 app 很大程度上依赖 cookie
    MilkCat
        4
    MilkCat  
       2020-03-27 13:13:17 +08:00   1
    写的挺好,赞
    milklee
        5
    milklee  
    OP
       2020-03-27 14:08:14 +08:00
    @FourAndHalf 没有吓唬你,之后苹果会默认禁用第三方 Cookie,但是用户是可以关闭的。如果你在 macOS 上的 Safari 打开了禁用第三方 Cookie,再访问淘宝,淘宝就会提示你要关闭禁用第三方 Cookie 才能访问淘宝
    butanediol2d
        6
    butanediol2d  
       2020-03-27 15:55:47 +08:00 via iPhone
    @milklee 现在的 safari 设定是默认屏蔽但可以手动解除,以后会改为强制屏蔽无法解除吗?
    surfire91
        7
    surfire91  
       2020-03-27 16:13:43 +08:00
    太多没看,是不是指的就是 SameSite ?
    milklee
        8
    milklee  
    OP
       2020-03-27 19:06:31 +08:00
    @butanediol2d 现在苹果还没有这个打算,但未来会怎样谁也不知道
    myqoo
        9
    myqoo  
       2020-03-31 14:12:02 +08:00
    屏蔽第三方 Cookie 是未来的趋势,现在 Chrome 也逐步推进(使用 samesite 过渡)。

    三方 Cookie 问题实在太多,除了 csrf 漏洞,特别是在不安全的网络里,用户访问任何一个 HTTP 页面就可以泄露一大批网站的 cookie 。
    xiaole
        10
    xiaole  
       2020-04-25 21:24:51 +08:00
    今天再看,我觉得可以利用第三方 Cookies 做白名单认证,所有备案域名都必须加载一段三方 Cookies,没有这个的禁止访问...
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2760 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 08:25 PVG 16:25 LAX 00:25 JFK 03:25
    Do have faith in what you're doing.
    ubao msn 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