cookie那些事

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.comwww.taobao.comwww.sina.comwww.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.comwww.bbb.com想接入它的廣告

  1. www.aaa.comwww.bbb.com在所有頁(yè)面上加一行代碼:<script type="text/javascript" src="http://www.ccc.com:1234/ads.aspx"></script>

  2. www.ccc.com在這個(gè)頁(yè)面上種下一個(gè)domain=www.ccc.com的cookie,這樣www.aaa.comwww.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-阻止
  1. 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"
  2. DNT設(shè)置后,請(qǐng)求頭中會(huì)加上 DNT:1,如果網(wǎng)站遵守DNT協(xié)議,就不再種第三方cookie了,但也可以耍賴(lài)不遵守,全看素質(zhì)
  3. 如果用戶(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.comwww.bbb.com接入了它的廣告

  1. 修改host
    127.0.0.1 www.aaa.com www.bbb.com www.ccc.com
  2. 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>');");
    }
}
  1. www.aaa.comwww.bbb.com頁(yè)面代碼

     <script type="text/javascript" src="http://www.ccc.com:1234/ads.aspx"></script>
    
  2. 打開(kāi)www.aaa.comwww.bbb.com頁(yè)面就可以互相看到訪問(wèn)記錄了

異類(lèi) falsh cookie

這貨太變態(tài),不在本文討論范圍內(nèi),有興趣的可以自行百度之
總而言之就一句話,cookie能干的它能干,cookie不能干的它也能干,當(dāng)然cookie沒(méi)有的問(wèn)題它也有了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容