第三方cookie和第一方的cookie并不是技术上的区分,而是业务上的区别,我很赞同这句话,因为我觉得第三方和第一方都是一个相对的概念,其实我们操作的都是自己域下的cookie,只是在某种情景下的操作,我们称之为第三方域下cookie的操作
-------题记
注:此处讲的是跨一级域操作cookie,如果只是跨二级域的话,很简单,只需要设置cookie的domian为一级域名,并辅以path属性的设置即可;
关于跨域,首先我们要明确一个概念,根据安全策略,我们永远不可能操作第三域的cookie,比如在A域的页面试图去读取一个domian为B域的cookie;或者在域A的页面试图通过域A页面的JS或者来自域A的http请求返回让浏览器去写入一个domain为B域的cookie;
到底能不能跨域,跨的是什么域,我觉得这个是我们需要最开始弄清楚的地方,是后面操作一起的基础。因为有些事我们可以努力,有些事我们努力了也不会有结果。
记得曾经看到过一篇文章讲到,第三方cookie和第一方的cookie并不是技术上的区分,而是业务上的区别,我很赞同这句话。因为我觉得第三方和第一方都是一个相对的概念,其实我们操作的都是自己域下的cookie,只是在某种情景下的操作,我们称之为第三方域下cookie的操作。当然在这儿,我们假设我们已经对第一方和第三方cookie的定义有了完整准确的理解。
cookie的读写场景一般有两种,一般分为前台的JS的操作,和通过http请求传递到后台的读,及http响应的写操作。
前台的JS的读写是受同源策略限制的,我们永远只能将要写的cookie设置和当前载入js的文档为同一个域,就算是通过iframe引入的页面中的JS视图去读写的cookie也是只能和iframe的src是同一个域。
第二种一般发生在页面中包含了另外一个域的请求,比如iframe,img,script都可以。http请求一般都是携带cookie的,这个毋庸置疑,而且只能携带和请求同一个域下的cookie,但是当这个请求发生在另外一个域的页面中的时候,就会产生问题,这个时候对于主页面来说,你在我的页面请求读取不是我域下的cookie,也就是说你想跨域,这个时候他就不会让你这么轻易的得逞,关于这种情况的分析,下面会讲到。如果一个跨域的请求返回了一个写cookie的指令,前提是你写的是和自己请求的域是同一个域的cookie,如果是其他域的,就算和主域是同一个域,想都别想。这个时候你也不是这么容易办到的,因为对于主域来说,你又在想跨我的域来操作,肯定也不是那么容易让你得逞的。
现在我们先来假设这样一个场景,我们访问一个域A的页面(我们成为A_1页面),A_1页面的底部通过iframe引入一个域B的页面(我们称为B_1页面);
此时我们关心的是这个发向域B的请求会不会携带域B的cookie和来自域B的响应能不能在导航栏为域A的页面的情况下写入cookie;
因为对于A页面来说,此时在来自它的window中有一个关于域B的cookie操作请求,此时就发生了我们常说的跨域操作cookie的情况。
我们首先先拿出结果,在一般情况下,也就是没有服务端p3p的干预的情况下,B_1的请求中是不会携带域B的cookie的,域A的就更别想了。而且B_1的响应中携带的cookie是能够返回的。但是不能写到内存或者硬盘中的。
但是在火狐中就完全不存在这个问题了,完全可以正常操作。
对于火狐中不存在这个问题就没有什么好讲的了,IE中不支持的话我们就得分析问题去解决了。
在这里有一个概念就不得不提了,因为没有这个概念,我们上面谈的问题都不是问题,那就是p3p,关于这个概念,或者称之为协议,我们可以上网了解。它大概可以分为两部分,一部分是浏览器端用户设置的隐私偏好(有这个部分的前提是浏览器支持p3p),和服务端的隐私申明。比如用户可以在IE浏览器中设置隐私级别,默认级别一般都是中。一部分是服务端在头信息关于当前网页隐私安全性的声明;浏览器在最后执行的时候会将隐私安全性的生命和用户设置的做对比,如果不匹配的话,会告知用户,由用户选择安全性的执行方案。
既然用户已经选择了不去允许域B的cookie写入,IE认为是不安全的,那么我们能做的修改就是修改服务端的隐私安全性声明了,具体怎么去加这个p3p的声明,网上有很多方法,百度一下就行,比如在response的header中添加一个头信息:P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"。
如果你看到这篇文章,发现有什么谬误之处,还请留言斧正,将万分感谢!
分享到:
相关推荐
本文介绍了一种基于可变Cookie的跨域单点登录方案,该方案通过引入随机生成的票据和现代加密技术,有效地解决了跨域认证问题,并确保了用户身份验证的安全性和可信度。 #### 基本原理 传统的单点登录解决方案大多...
在以前的部署中,通过将cookie的Domain属性设置为一级域名(例如.***),使得所有二级域名下的网站能够共享Cookie信息,实现单点登录(SSO)。然而在新的环境中,由于没有域名,只能使用IP地址,这种情况下,直接...
总的来说,PHP跨域Cookie共享是通过在主域设置Cookie时指定目标域,并在目标域中正确读取Cookie来实现的。需要注意的是,这可能会带来一些安全风险,因为跨域设置Cookie可能导致敏感信息泄露。因此,务必谨慎使用,...
总之,正确设置Cookie的作用域是实现二级域名与顶级域名同步登录的关键步骤。通过在PHP配置文件中调整`cookiedomain`,你可以确保用户在整个网站的各个部分都能保持一致的登录状态,同时要注意保护用户数据的安全。
Cookie跨域是一个常见的需求,例如用户在`a.com`登录后希望在`b.com`也保持登录状态。由于同源策略的限制,直接设置`domain`无法实现跨主域的Cookie共享。但是,可以利用iframe实现跨域通信。 以下是一个使用iframe...
当涉及到二级域名或跨域共享时,这意味着一个网站的Cookie需要在它的子域名或者完全不同的域下也能被访问。 **实现步骤** 1. **设置`Domain`属性**:这是实现跨域共享的关键。在创建或更新Cookie时,需要设置`...
要解决一级域名与二级域名之间共享Cookie的问题,我们需要在设置Cookie时指定它的域为一级域名,这样二级域名下也能访问到这个Cookie。在PHP中,我们可以使用`setcookie()`函数来设置Cookie,其参数中包含了域的设定...
跨域访问时,由于浏览器的同源策略,通常不允许一个域设置另一个域的Cookie。但通过设置P3P(Platform for Privacy Preferences)政策,可以让浏览器接受跨域Cookie,实现SSO。 6. **CORS(Cross-Origin Resource ...
- **设置共同的Cookie**: 当用户在主域(如`.a.com`)登录后,服务器将Session ID作为Cookie设置,其Domain属性设置为主域,这样所有二级域名都可以访问这个Cookie。例如,使用PHP的`setcookie()`函数,设置`domain...
若要实现跨域,如在`jb51.net`及其所有二级域名之间共享Cookie,我们需要设置`Response.Cookies("MyCookie").Domain = "jb51.net"`。这样,无论用户访问`jb51.net`还是`s.jb51.net`,都能读取到这个Cookie。 2. **...
跨域单点登录(Single Sign-On,简称SSO)是一种身份验证机制,允许用户在一个系统中登录后,无需再次认证即可访问其他系统。在互联网应用环境中,尤其在企业级应用中,用户通常需要访问多个相互关联但独立部署的...
Cookie的作用域是指定义了Cookie可以在哪些页面或路径下被访问。理解Cookie的作用域对于优化网站功能和提高用户体验至关重要。 `setcookie()` 是PHP中用于设置Cookie的主要函数。它的基本语法如下: ```php ...
跨域是指一个域下的文档或脚本尝试请求另一个域下的资源。在跨域点单登录场景下,用户在多个子站点之间切换时,需要能够平滑地进行身份验证,而不会受到同源策略的限制。 点单登录,顾名思义,是指用户在一个应用中...
**使用相同的Cookie域**:将所有二级域名设置为共享主域名的Cookie,例如,如果主域名为`example.com`,二级域名为`sub1.example.com`和`sub2.example.com`,那么设置Cookie的Domain属性为`.example.com`,这样所有...
在未绑定域名的情况下,前后台可以同步登录和退出,这是因为session的作用域不受限制,通常默认为浏览器一级域名。然而,当用户通过特定的域名访问时,session的作用域会限制在该域名下,这样就无法实现跨域的同步...
如果设置为"anonymous",表示在发送请求时不会携带任何用户凭证(如cookie),这通常会满足跨域共享资源的简单需求。当设置为"use-credentials"时,请求将携带用户凭证,适用于需要认证信息的高级用例。 为实现跨域...
由于浏览器的同源策略限制,通常一个页面只能访问属于同一域的cookie。然而,在某些情况下,如使用JSONP进行跨域请求,可能需要共享cookie。这时,服务器需要配置允许跨域,同时在设置cookie时,确保`domain`设置...
document.cookie是一个字符串,包含了当前域下的所有cookie,各cookie之间以分号和空格分隔。 3. 读取Cookie 要读取特定名称的cookie,可以使用以下JavaScript函数: ```javascript function getCookie(name) { ...