cookie那些事
本文面向?qū)ookie有基本了解的讀者,小白出門(mén)左轉(zhuǎn)
設(shè)置cookie (HTTP 響應(yīng)頭)
Set-Cookie: {name}={value};path={path};domain={domain};expires={expires},secure;HttpOnly; //多個(gè)cookie就發(fā)送多個(gè)Set-Cookie頭
發(fā)送cookie (HTTP 請(qǐng)求頭)
Cookie: {name}={value};{name2}={value2} //多個(gè)cookie以";"號(hào)隔開(kāi)
請(qǐng)求頭格式比較簡(jiǎn)單,這里主要說(shuō)下響應(yīng)頭
name cookie名稱(chēng)
value cookie值,部分語(yǔ)言會(huì)有子cookie實(shí)現(xiàn),格式為 {key1}={value1}&{key2}={value2}
path cookie有效路徑,不同語(yǔ)言默認(rèn)策略不一樣,部分語(yǔ)言默認(rèn)"/",部分語(yǔ)言默認(rèn)當(dāng)前頁(yè)面所在目錄
domain cookie有效域名,默認(rèn)當(dāng)前域名,二級(jí)域名可以訪問(wèn)主域名下的cookie(需要以"."開(kāi)頭,如".aaa.com"),三級(jí)域名可以訪問(wèn)二級(jí)域名下的cookie,以此類(lèi)推。 如果當(dāng)前訪問(wèn)的是www.aaa.com,而設(shè)置Domain為www.bbb.com,則屬于第三方cookie(下邊詳述)
expires cookie有效期,不設(shè)置默認(rèn)當(dāng)前session,瀏覽器關(guān)閉則cookie失效,如果expires時(shí)間早于瀏覽器時(shí)間,則cookie立即失效
secure 帶上這個(gè)標(biāo)識(shí)表示只有在https協(xié)議的請(qǐng)求中才發(fā)送此cookie
HttpOnly 表示cookie只允許通過(guò)服務(wù)器修改,客戶(hù)端js不允許修改`
cookie跨域
主域名相同
如www.aaa.com和bla.aaa.com
設(shè)置cookie的domain為".aaa.com"
主域名不同
如www.aaa.com和www.bbb.com
設(shè)置第三方cookie
第三方Cookie
-
什么是第三方cookie?
訪問(wèn)www.aaa.com的時(shí)候設(shè)置了一個(gè)domain=www.bbb.com的cookie,對(duì)于www.aaa.com來(lái)說(shuō),這個(gè)cookie就是第三方的
-
哪些場(chǎng)景需要第三方cookie?
比如,兩個(gè)不同域名的網(wǎng)站做sso,如www.tmall.com和www.taobao.com,www.sina.com和www.weibo.com
比如,廣告服務(wù)商追蹤用戶(hù)行為,根據(jù)用戶(hù)瀏覽記錄給用戶(hù)推薦更符合胃口的廣告(這里存在隱私泄漏風(fēng)險(xiǎn),因?yàn)閺V告服務(wù)商可以獲取用戶(hù)的瀏覽記錄) -
怎么做?
以廣告追蹤為例子,www.ccc.com是個(gè)廣告服務(wù)供應(yīng)商,www.aaa.com和www.bbb.com想接入它的廣告
www.aaa.com和www.bbb.com在所有頁(yè)面上加一行代碼:<script type="text/javascript" src="http://www.ccc.com:1234/ads.aspx"></script>
-
www.ccc.com在這個(gè)頁(yè)面上種下一個(gè)domain=www.ccc.com的cookie,這樣www.aaa.com和www.bbb.com的所有頁(yè)面在打開(kāi)的時(shí)候都會(huì)給www.ccc.com發(fā)送一個(gè)帶cookie的請(qǐng)求,www.ccc.com拿到這個(gè)cookie后就可以區(qū)分用戶(hù)了,然后通過(guò)referer拿到用戶(hù)正在瀏覽的頁(yè)面地址,就可以掌握用戶(hù)的瀏覽行為了
由上可見(jiàn),如果一個(gè)廣告服務(wù)商接入的客戶(hù)足夠多,就可以掌握一個(gè)用戶(hù)大多數(shù)的瀏覽行為,因?yàn)檫@個(gè)用戶(hù)瀏覽的大多數(shù)網(wǎng)站可能都是這個(gè)服務(wù)商的客戶(hù),而且他們共用一個(gè)cookie
- 瀏覽器設(shè)置
瀏覽器 | 默認(rèn)設(shè)置是否支持第三方cookie | DNT設(shè)置 | 如何阻止第三方cookie |
---|---|---|---|
Chrome | 是 | 設(shè)置-隨瀏覽器一起發(fā)送"不跟蹤"請(qǐng)求 | 設(shè)置-內(nèi)容設(shè)置-阻止第三方cookie和網(wǎng)站數(shù)據(jù) |
Firefox | 是 | 選項(xiàng)-隱私-要求此網(wǎng)站不要跟蹤您 | 選項(xiàng)-隱私-使用自定義歷史記錄設(shè)置-接受第三方cookie-總不 |
IE | 需要額外的P3P響應(yīng)頭 | 選項(xiàng)-高級(jí)-向你在IE中訪問(wèn)的站點(diǎn)發(fā)送"Do Not Track"請(qǐng)求 | 選項(xiàng)-隱私-高級(jí)-替代自動(dòng)cookie處理-第三方cookie-阻止 |
- IE的默認(rèn)安全性等級(jí)為中,將阻止沒(méi)有精簡(jiǎn)隱私策略的第三方cookie,具體P3P協(xié)議詳情,請(qǐng)參考http://www.w3.org/P3P/
這里給個(gè)P3P的例子P3P:CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR" - DNT設(shè)置后,請(qǐng)求頭中會(huì)加上 DNT:1,如果網(wǎng)站遵守DNT協(xié)議,就不再種第三方cookie了,但也可以耍賴(lài)不遵守,全看素質(zhì)
- 如果用戶(hù)設(shè)置阻止第三方cookie了,那對(duì)不起,所有第三方cookie就無(wú)效了
Cookie安全
由于cookie記錄了用戶(hù)的身份,因此成為攻擊者的熱門(mén)攻擊對(duì)象,開(kāi)發(fā)者稍有疏忽,就可能節(jié)操不保
這里列舉下可能的攻擊方式,詳情請(qǐng)自行百度之,總之不要相信cookie,不要放未加密的敏感信息到cookie中,cookie在使用前要校驗(yàn),合理使用secure和HttpOnly,由于第三方cookie的存在,敏感的操作需要驗(yàn)證,不要相信正在操作的人就是當(dāng)前登錄的用戶(hù),看下CSRF攻擊吧
XSS,反射型XSS,session劫持,CSRF攻擊
第三方cookie代碼實(shí)例(asp.net)
www.ccc.com是廣告服務(wù)提供商,www.aaa.com和www.bbb.com接入了它的廣告
- 修改host
127.0.0.1 www.aaa.com www.bbb.com www.ccc.com - www.ccc.com廣告服務(wù)商ads.aspx代碼
private static IDictionary<string,IList<string>> histories = new Dictionary<string, IList<string>>();
protected void Page_Load(object sender, EventArgs e)
{
Response.ContentType = "text/javascript";
//用戶(hù)開(kāi)啟了瀏覽器"不跟蹤"選項(xiàng)
if (!string.IsNullOrWhiteSpace(Request.Headers.Get("DNT")) && int.Parse(Request.Headers.Get("DNT")) == 1)
{
Response.Write(@"document.write('用戶(hù)開(kāi)啟了瀏覽器Do Not Track選項(xiàng),我比較講究,遵守這個(gè)約定,不跟蹤你了,只能給你展示大眾版的廣告了');");
return;
}
var uuid = Request.Cookies["uuid"];
//種第三方cookie
if (uuid == null) {
uuid = new HttpCookie("uuid")
{
Value = Guid.NewGuid().ToString(),
Domain = "www.ccc.com",
Expires = DateTime.Now.AddYears(70),
};
Response.Cookies.Add(uuid);
//使用P3P協(xié)議提高cookie種上的概率
Response.Headers.Add("P3P", "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\"");
}
//獲取用戶(hù)正在瀏覽的網(wǎng)址
var referer = Request.Headers.Get("Referer");
//記錄用戶(hù)訪問(wèn)歷史
if (!histories.ContainsKey(uuid.Value)) {
histories[uuid.Value] = new List<string>();
}
histories[uuid.Value].Add(DateTime.Now + ": " + referer);
Response.Write(@"document.write('<br><br>blabla這里是根據(jù)你瀏覽的網(wǎng)址給你推薦最合適的廣告'+
',不要問(wèn)我怎么知道哪個(gè)網(wǎng)址有什么內(nèi)容,也不要問(wèn)我怎么知道哪些廣告最適合你,我會(huì)告訴你我有高大上的算法嘛<br><br>');");
Response.Write(@"document.write('下邊是你的瀏覽記錄(不好意思,我看到了羞羞的東東):<br>');");
foreach (string history in histories[uuid.Value]) {
Response.Write("document.write('" + history + "<br>');");
}
}
-
www.aaa.com和www.bbb.com頁(yè)面代碼
<script type="text/javascript" src="http://www.ccc.com:1234/ads.aspx"></script>
打開(kāi)www.aaa.com和www.bbb.com頁(yè)面就可以互相看到訪問(wèn)記錄了
異類(lèi) falsh cookie
這貨太變態(tài),不在本文討論范圍內(nèi),有興趣的可以自行百度之
總而言之就一句話,cookie能干的它能干,cookie不能干的它也能干,當(dāng)然cookie沒(méi)有的問(wèn)題它也有了