Cookie的跨域问题

时间:2023-11-16 15:06:14

被误解的HttpCookie.Domain属性

有人说可以利用HttpCookie.Domain属性实现跨域访问,假如在A站(A.com)中写B站(B.com)的cookie,如下所示

这其实是错误的,运行后通过浏览器查看,并没有成功写入B站的cookie(读取也是一样失败,由于浏览器的隐私策略限制,禁止读取非本域的cookie).

所以这个Domain属性,应该是可以跨子域,例如x.A.com和y.A.com,通过设置HttpCookie.Domain=“.A.com”,实现跨子域访问。

//A站a_setCookie.aspx (www.a.com)
HttpCookie cookie = new HttpCookie("key");
cookie.Value = key;
cookie.Domain = ".b.com";//这里指定的是B站
cookie.Path = "/";
cookie.Expires = DateTime.Now.AddHours();
filterContext.RequestContext.HttpContext.Response.Cookies.Add(cookie);

既然cookie无法跨域共享,那如何实现跨域访问呢?

可以利用script标签间接调用B站的页面,实现写入B站cookie的目的。

步骤一:先在B站(b_setCookie.aspx)下设置cookie的方法:

HttpCookie cookie = new HttpCookie("key");
cookie.Value = key;
cookie.Domain = ".b.com";//这里指定的是B站
cookie.Path = "/";
cookie.Expires = DateTime.Now.AddHours(1);
Response.Cookies.Add(cookie);
 

步骤二:由于<script>标签可以自动访问第三方网站,因此可以在A站的页面,例如a_setCookie.aspx的页面<head>标签内下设置如下:

<head><script src="http://www.b.com/b_setCookie.aspx" /></head>

以上步骤完毕,当访问A站的a_setCookie.aspx时,就会自动访问http://www.b.com/b_setCookie.aspx,实现写入B站cookie的目的。

测试B站cookie是否设置成功,B站下新建页面b_getCookie.aspx,读取B站的cookie

var key=Request.cookie["key"];
//或者
key=Request["key"];

注意:访问b_getCookie.aspx前,先访问A站的a_setCookie.aspx

注意浏览器的第三方 cookie 限制

所谓第三方 cookie,就是说你访问域名 A的一个页面,却接收到域名 B 的 cookie 设定指令。那么B就属于第三方,不同浏览器对于第三方cookie的限制有些区别,如下表

不同浏览器的第三方 cookie 规则
  IE FIREFOX CHROME SAFARI OPERA
限制第三方coookie

使用p3p跨域设置Cookie

p3p((Platform for Privacy Preferences))介绍

http://baike.baidu.com/link?url=WVQp0aTUQgCoIzYm7rV_mur829NtWZCiSq9Kee_WusqmOWOQDwS2DNzw_S5M6UM-EcvNCliBHvYAV4kEjRBip_

为了消除这个限制,可以在b_setCookie.aspx加上如下设置

Response.Headers.Add("P3P", "CP=/"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR/"");