`
天梯梦
  • 浏览: 13790301 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

当浏览器默认禁用第三方cookie

 
阅读更多

前一阵子,我们发现高版本的Safari中默认会阻止第三方cookie,如下图所示。

Safari默认阻止第三方cookie

 

问题

什么是第三方cookie呢?在访问一个网站A时,网站A算作第一方,如果网站A中引用了另一个网站X(网站X的域名与网站A的域名不同)的资源, 这时这个网站X就被认为是第三方。需要注意的是,这儿区分不同网站的标准是域名是否相同,而不是这两个网站是否由同一个公司运营。比 如,taobao.com和tmall.com被认为是两个网站,尽管它们都属于阿里集团。

 

在网站建设中,使用第三方资源非常常见,大多数据情况下,这并不会带来问题。不过有时候,我们可能希望能读写这个第三方域下的cookie,这时问题就来了。

 

比如我们有一个网站a.com,其中埋有一段JavaScript脚本,每当用户打开a.com中的页面时,这段脚本就会发送一个GET请求到x.com。这样,只需要分析x.com的日志,就可以了解a.com的访问情况。

 

如果只是要统计a.com的PV,那么只需要将x.com的日志中所有记录加起来就行了,但是,如果要统计UV呢?

 

这时就需要在x.com这个域下写一个cookie用于标识当前用户,比如叫USER_ID。当用户访问a.com的页面,也即发起到x.com的 请求时,x.com的服务器检查x.com域下是否有USER_ID这个cookie,如果有则什么也不做,如果没有,则生成一个新的USER_ID并写 入cookie。有了这个cookie之后,分析x.com的日志就可以同时得到a.com的PV与UV。整个打点过程如下图所示。

打点 使用第三方cookie

但问题是,x.com在这儿属于第三方域,在高版本的Safari浏览器中,向第三方域写cookie受到了阻止。带来的结果就是,用户每次访问 a.com时,发向x.com的请求的cookie都为空,于是x.com的服务器每次都认为这是一个新访问者,每次都生成一个新的USER_ID写回 去,但当同一个用户再访问下一个a.com的页面时,发向x.com的请求的cookie仍然为空。最后,分析x.com的日志时就会发现,访问PV没有 变化,但UV却暴涨,几乎和PV持平。

 

或许有人会问,打点服务器为什么要使用第三方域x.com呢?如果使用与站点相同的域a.com不就没有问题了吗?的确,如果打点服务器与站点同域那就没有问题了,不过很多时候我们并不能做到这一点,比如我们可能需要向很多个域名完全不同的站点提供同一套打点服务。

 

这个问题目前并不算严重,因为还只有高版本的Safari有这样的限制。但是,Safari增加这个限制是为了保持用户隐私(因为有大量的广告站点滥用第三方cookie),很有可能在不久的将来其他浏览器也会跟进,因此我们不得不尽早寻找解决之道。

 

P3P方案在这儿也是走不通的,KISSY的开发者承玉曾经提出过一个解决方案, 简单来说,就是使用POST来代替GET,这样就能继续在高版本的Safari中写入第三方cookie。但遗憾的是这个方案在Safari 5.1.4+的版本中失效了,估计Safari已经修复了漏洞。另外,Google曾经因为使用类似的方式继续在高版本Safari下读写第三方 cookie而被告上法庭,在去年8月时被罚款2250万美元,也就是说,如果继续使用各种hack的方式绕过浏览器限制读写第三方cookie,有可能面临法律风险。而且随着浏览器不断升级,各种原来可用的hack方式也都陆续失效了。

 

因此,必须要寻找其他解决方案。

 

第二方方案

经过测试,我们发现目前Safari只会在第三方域下完全没有cookie时阻止第三方cookie,而第三方域下只要有过任意一个cookie,即可继续使用以前的方式顺利读写。但是,怎么才能在第三方域下写入第一个cookie呢?

我们测试了很多方案,包括iframe嵌套等,最后发现至少在Safari 6中,如果第三方域下完全没有cookie,那么就没有办法向其写入cookie,唯一的办法是将它变成第二方,也即让这个域在顶层窗口打开。也就是说, 如果第三方域下没有cookie,要向它写入第一个cookie,要么将页面先跳到这个域,写入cookie,再跳回来,要么弹出一个新窗口,写入 cookie,再关闭弹窗。

显然,这两种方案对用户体验来说都不好。

 

localStorage方案

我们注意到,高版本Safari只阻止了第三方cookie,并没有阻止第三方localStorage,于是,我们便有了一个更为激进的方案:放弃第三方cookie,使用localStorage来代替。

 

这个方案的本质是这样的:在a.com中嵌入一个w.com域的iframe,这个iframe读取localStorage(是w.com域 下),取到各种原来需要保存在第三方cookie中的值,然后发送一个GET或POST请求到x.com,原来那些记录在cookie中随着HTTP请求 头发送的信息则改为通过url参数(GET方式)或Form表单(POST方式)的形式发送。如果要发送的内容不多,那么可以使用GET方式发送,只需返 回一个jsonp即可,然后iframe再将jsonp中的数据写入localStorage。如果需要发送的内容很多,有可能使URL超长,那么就需要 使用POST方式发送,这时,需要在iframe中再创建一个iframe作为POST的target,然后新iframe再将数据用 postMessage等方式传回原iframe,原iframe再写回localStorage。

 

整个过程(使用POST)如下图所示:

打点 使用localStorage

这个方案的问题是比较复杂,整个流程长了很多,需要用到一些HTML5特性,比如localStorage、postMessage等,不过好在不支持第三方cookie的浏览器基本上都是对HTML5支持良好的高版本浏览器。

就目前来看,比较保险的做法是新老方案并行,在老浏览器上继续使用第三方cookie,在高版本Safari等默认阻止第三方cookie的浏览器上使用新方案。虽然不完美,但确实是可行的。期待不久的将来能有一种更完美的方案。

 

2013-03-26更新:Firefox开始跟进Safari默认阻止第三方cookie的策略

原文:http://oldj.net/article/third-party-cookie/

 

分享到:
评论

相关推荐

    超好用的浏览器下载工具,内有很多浏览器

    4. **隐私保护**:浏览器的隐私设置允许用户控制cookie的使用,禁用第三方追踪,并提供无痕浏览模式。Firefox的Tor匿名网络插件和 Brave浏览器的内置广告拦截及隐私保护是其中的突出例子。 5. **扩展与插件**:...

    session与cookie的区别和联系?

    - Cookie可能涉及到用户隐私问题,尤其是第三方Cookie,容易被用于跨站追踪。 - Session由于数据存储在服务器端,更有利于保护用户隐私。 5. **依赖性**: - Cookie可以独立工作,但Session依赖于Cookie来传递...

    Yandex浏览器

    例如,"隐身模式"可以在不记录浏览历史的情况下浏览网页,而“私人窗口”则进一步增强了隐私保护,不仅不记录历史,还禁用了第三方cookie,防止数据被追踪。此外,用户还可以自定义浏览器的隐私设置,管理cookies和...

    session和cookie的区别

    5. **安全性**:虽然Cookie可以存储信息,但它们是可被第三方读取的,因此不适合存储敏感信息。 **Session** Session是服务器端的状态保持机制。服务器为每个用户创建一个唯一的Session ID,并通过某种方式(通常...

    Cookie、Session学习笔记

    1. 安全性:Session通常比Cookie更安全,因为数据存储在服务器端,不易被第三方获取。 2. 存储:Cookie数据受限于客户端,而Session数据在服务器端,容量更大。 3. 性能:Cookie对客户端网络和服务器带宽的影响较小...

    Cookie与互联网:一半是广告 一半是隐私.docx

    微软在2021年的决定,即默认禁止IE10浏览器上的第三方Cookie追踪,虽然被视为保护用户隐私的举措,但也可能对依赖广告业务的公司构成挑战。 在平衡隐私与便利之间,业界提出了多种解决方案。创新工场的李开复建议,...

    Java使用cookie和session共7页.pdf.zip

    4. 安全性较低:因为数据存储在客户端,容易被第三方读取,不适合存储敏感信息。 Session则是在服务器端维护的一种数据结构,用于存储特定用户会话的相关信息。当用户登录后,服务器会为其创建一个Session对象,并...

    IE8浏览器排除使用故障.docx

    解决方法是进入“Internet选项”的“隐私”选项卡,点击“高级”按钮,勾选“替代自动Cookie处理”,并将“第一方Cookie”和“第三方Cookie”均设置为“接受”,同时选中“总是允许会话Cookie”,最后重启IE8。...

    使用phpMyAdmin 时,"必须启用 Cookies 才能登录",问题的解决

    在IE 6.0版本中,进入“工具”> “Internet选项”> “隐私”,然后选择“高级”,勾选“覆盖自动cookie处理”,并确保第一方和第三方cookie都设置为“接受”,同时也要开启“总是允许会话cookie”。对于IE 5.0版本,...

    flagCookies:cookie管理器,浏览器加载项,用于管理和标记cookie。 关于类固醇

    cookie管理器,允许显式标记和设置cookie(也包括第三方cookie)的规则。 domain.net和subdomain.domain.net具有单独的权利。 在登录到网站或服务中时,提供几种模式来为cookie设置规则并保留cookie配置文件。 注意 ...

    Ghost Exp 浏览器.zip

    此外,它可能还具备了防止追踪的功能,阻止广告商和其他第三方获取用户的浏览历史和行为数据。 2. **隐私保护**:对于注重隐私的用户,Ghost Exp 可能提供了严格的隐私设置,例如无痕浏览模式,不保存浏览历史、...

    IE的cookie机制导致的session问题及解决办法.doc

    如果在frameset内嵌入的frame来自第三方站点(具有不同的IP地址或域名),IE默认会禁用这些站点的Cookie,即在HTTP请求头中不会包含它们的Cookie信息,即便包括Session相关的Cookie。尽管如此,这些站点在响应中设置...

    Vue axios 跨域请求无法带上cookie的解决

    在开发Web应用时,Vue与axios的组合常常用于构建前端接口调用。...同时,也要检查是否存在像mock.js这样的第三方库可能干扰正常请求的情况。通过这些步骤,通常可以成功解决跨域请求携带cookie的问题。

    默认行为中文手册.chm

    6. **插件和ActiveX**:介绍IE对第三方插件和ActiveX控件的支持,如何安装、启用或禁用它们,以及相关的安全问题。 7. **打印和保存**:讨论如何在IE中打印网页,以及如何将网页保存为不同格式,如HTML、MHT(单个...

    JavaScript cookie原理及使用实例

    它们可以被禁用、删除,也可以被第三方程序读取,包括恶意软件。为了增强安全性,通常会对敏感信息进行加密,如使用MD5算法。 4. **域限制**:Cookie只能在设置它的域内使用,不同域名的Cookie不能共享数据。 5. **...

    cookie-notice:基于 Cookie 的通知

    5. **第三方 Cookie**:如果网站使用第三方服务(如 Google Analytics),也需要处理这些服务的 Cookie。这可能涉及到通过 API 或配置文件来控制第三方服务的 Cookie 设置。 6. **国际化**:为了适应全球用户,...

    安全-csrf详解文档

    请求可以来自第三方网站,因此称为“跨站”。例如,黑客Mallory想要通过CSRF攻击使受害者Bob将钱转到自己的账户下。Mallory通过构建一个含有恶意URL的网站,诱导Bob访问。当Bob访问该网站时,恶意URL会从Bob的浏览器...

    IE8故障应该怎么解决.docx

    “Internet选项”的“隐私”选项卡中,点击“高级”,勾选“替代自动Cookie处理”,并将“第一方cookie”和“第三方cookie”都设置为“接受”,同时选中“总是允许会话cookie”,然后重启浏览器。 4. **进程关闭...

    j2ee,ex2答案

    Cookie有大小和数量限制,且安全性相对较弱,因为它们可以被第三方读取。 **3. Session与Cookie的区别与联系** - 存储位置:Session数据存储在服务器端,而Cookie数据存储在客户端。 - 安全性:由于Session数据存储...

    干净的浏览器:启动带有干净的指纹的干净浏览器,以避免窥探科技公司的眼睛

    9. **控制Cookie**:只允许必要的Cookie,或者使用第三方Cookie拦截工具,防止被用于追踪。 通过以上措施,可以显著提高在线隐私保护水平,降低科技公司通过浏览器指纹进行用户追踪的可能性。然而,需要注意的是,...

Global site tag (gtag.js) - Google Analytics