cookie相關(guān)

1)cookie是一個(gè)很小的文本文件,是瀏覽器儲(chǔ)存在用戶的機(jī)器上的。Cookie是純文本,沒有可執(zhí)行代碼。儲(chǔ)存一些服務(wù)器需要的信息,每次請(qǐng)求站點(diǎn),會(huì)發(fā)送相應(yīng)的cookie,這些cookie可以用來辨別用戶身份信息等作用。

2)禁止javascript操作cookie(為避免跨域腳本(xss)攻擊,通過javascript的document.cookie無法訪問帶有HttpOnly標(biāo)記的cookie。)
3)cookie是一個(gè)很小的文本文件,是瀏覽器儲(chǔ)存在用戶的機(jī)器上的。Cookie是純文本,沒有可執(zhí)行代碼。儲(chǔ)存一些服務(wù)器需要的信息,每次請(qǐng)求站點(diǎn),會(huì)發(fā)送相應(yīng)的cookie,這些cookie可以用來辨別用戶身份信息等作用。

https://www.cnblogs.com/zhuanzhuanfe/p/8010854.html

前言

網(wǎng)絡(luò)早期最大的問題之一是如何管理狀態(tài)。簡而言之,服務(wù)器無法知道兩個(gè)請(qǐng)求是否來自同一個(gè)瀏覽器。當(dāng)時(shí)最簡單的方法是在請(qǐng)求時(shí),在頁面中插入一些參數(shù),并在下一個(gè)請(qǐng)求中傳回參數(shù)。這需要使用包含參數(shù)的隱藏的表單,或者作為URL參數(shù)的一部分傳遞。這兩個(gè)解決方案都手動(dòng)操作,容易出錯(cuò)。

網(wǎng)景公司當(dāng)時(shí)一名員工Lou Montulli,在1994年將“cookies”的概念應(yīng)用于網(wǎng)絡(luò)通信,用來解決用戶網(wǎng)上購物的購物車歷史記錄,目前所有瀏覽器都支持cookies。

cookie是什么

cookie翻譯過來是“餅干,甜品”的意思,cookie在網(wǎng)絡(luò)應(yīng)用中到處存在,當(dāng)我們?yōu)g覽之前訪問過的網(wǎng)站,網(wǎng)頁中可能會(huì)顯示:你好,王三少,這就會(huì)讓我們感覺很親切,像吃了一塊很甜的餅干一樣。

由于http是無狀態(tài)的協(xié)議,一旦客戶端和服務(wù)器的數(shù)據(jù)交換完畢,就會(huì)斷開連接,再次請(qǐng)求,會(huì)重新連接,這就說明服務(wù)器單從網(wǎng)絡(luò)連接上是沒有辦法知道用戶身份的。怎么辦呢?那就給每次新的用戶請(qǐng)求時(shí),給它頒發(fā)一個(gè)身份證(獨(dú)一無二)吧,下次訪問,必須帶上身份證,這樣服務(wù)器就會(huì)知道是誰來訪問了,針對(duì)不同用戶,做出不同的響應(yīng)。,這就是Cookie的原理。

其實(shí)cookie是一個(gè)很小的文本文件,是瀏覽器儲(chǔ)存在用戶的機(jī)器上的。Cookie是純文本,沒有可執(zhí)行代碼。儲(chǔ)存一些服務(wù)器需要的信息,每次請(qǐng)求站點(diǎn),會(huì)發(fā)送相應(yīng)的cookie,這些cookie可以用來辨別用戶身份信息等作用。

如圖所示,用戶首次訪問服務(wù)器,服務(wù)器會(huì)返回一個(gè)獨(dú)一無二的識(shí)別碼;id=23451,這樣服務(wù)器可以用這個(gè)碼跟蹤記錄用戶的信息,(購物歷史,地址信息等)。

cookie可以包含任意的信息,不僅僅是id,客戶端會(huì)記錄服務(wù)器返回來的Set-Cookie首部中的cookie內(nèi)容。并將cookie存儲(chǔ)在瀏覽器的cookie數(shù)據(jù)庫中,當(dāng)用戶訪問同一站點(diǎn)時(shí),瀏覽器就會(huì)挑選當(dāng)時(shí)該站點(diǎn)頒發(fā)的id=XXX的身份證(cookie),并在Cookie請(qǐng)求首部發(fā)送過去。

cookie的類型

可以按照過期時(shí)間分為兩類:會(huì)話cookie和持久cookie。

會(huì)話cookie是一種臨時(shí)cookie,用戶退出瀏覽器,會(huì)話Cookie就會(huì)被刪除了,持久cookie則會(huì)儲(chǔ)存在硬盤里,保留時(shí)間更長,關(guān)閉瀏覽器,重啟電腦,它依然存在,通常是持久性的cookie會(huì)維護(hù)某一個(gè)用戶周期性訪問服務(wù)器的配置文件或者登錄信息。

持久cookie 設(shè)置一個(gè)特定的過期時(shí)間(Expires)或者有效期(Max-Age)

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2019 07:28:00 GMT;

cookie的屬性

cookie的域

產(chǎn)生Cookie的服務(wù)器可以向set-Cookie響應(yīng)首部添加一個(gè)Domain屬性來控制哪些站點(diǎn)可以看到那個(gè)cookie,例如下面:

Set-Cookie: name="wang"; domain="m.zhuanzhuan.58.com"

如果用戶訪問的是m.zhuanzhuan.58.com那就會(huì)發(fā)送cookie: name="wang", 如果用戶訪問www.aaa.com(非zhuanzhuan.58.com)就不會(huì)發(fā)送這個(gè)Cookie。

cookie的路徑 Path

Path屬性可以為服務(wù)器特定文檔指定Cookie,這個(gè)屬性設(shè)置的url且?guī)в羞@個(gè)前綴的url路徑都是有效的。

例如:m.zhuanzhuan.58.com 和 m.zhaunzhuan.58.com/user/這兩個(gè)url。 m.zhuanzhuan.58.com 設(shè)置cookie

Set-cookie: id="123432";domain="m.zhuanzhuan.58.com";

m.zhaunzhuan.58.com/user/ 設(shè)置cookie:

Set-cookie:user="wang", domain="m.zhuanzhuan.58.com"; path=/user/

但是訪問其他路徑m.zhuanzhuan.58.com/other/就會(huì)獲得

cookie: id="123432"

如果訪問m.zhuanzhuan.58.com/user/就會(huì)獲得

cookie: id="123432"? cookie: user="wang"


secure

設(shè)置了屬性secure,cookie只有在https協(xié)議加密情況下才會(huì)發(fā)送給服務(wù)端。但是這并不是最安全的,由于其固有的不安全性,敏感信息也是不應(yīng)該通過cookie傳輸?shù)?

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure;

chrome 52和firefox 52 開始不安全的(HTTP)是無法使用secure的:

操作Cookie

通過docuemnt.cookie可以設(shè)置和獲取Cookie的值

document.cookie = "user=wang";

console.log(document.cookie);

禁止javascript操作cookie(為避免跨域腳本(xss)攻擊,通過javascript的document.cookie無法訪問帶有HttpOnly標(biāo)記的cookie。)

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2017 07:28:00 GMT; Secure; HttpOnly

第三方cookie

通常cookie的域和瀏覽器地址的域匹配,這被稱為第一方cookie。那么第三方cookie就是cookie的域和地址欄中的域不匹配,這種cookie通常被用在第三方廣告網(wǎng)站。為了跟蹤用戶的瀏覽記錄,并且根據(jù)收集的用戶的瀏覽習(xí)慣,給用戶推送相關(guān)的廣告。

如上圖(a):用戶訪問服務(wù)器1的一個(gè)頁面index.html,這個(gè)頁面和第三方廣告網(wǎng)站合作,這個(gè)頁面還有一張www.advertisement.com域名下的一張廣告圖ad1.jpg,當(dāng)請(qǐng)求這張ad1.jpg圖片的時(shí)候,www.advertisement.com這個(gè)服務(wù)器會(huì)給用戶設(shè)置cookie

Set-Cookie: user="wang";like="a"; domain="advertisement.com"

記錄用戶的瀏覽記錄,分配一個(gè)user來表示用戶的身份。

圖(b):用戶訪問服務(wù)器2的一個(gè)index.html頁面,這個(gè)頁面也和同一家廣告商合作,這個(gè)頁面也包含一張www.advertisement.com域名下的一張廣告圖ad2.jpg,當(dāng)請(qǐng)求這張ad2.jpg圖片的時(shí)候,瀏覽器就會(huì)向www.advertisement.com發(fā)送cookie

Cookie:? user="wang"; like="a";

www.advertisement.com收到瀏覽器發(fā)送的cookie識(shí)別了用戶的身份,同時(shí)又把這個(gè)頁面用戶的瀏覽數(shù)據(jù)設(shè)置cookie

Set-Cookie: buy="b"; domain="advertisement.com"

圖(c):很巧,用戶訪問服務(wù)器3的一個(gè)index.html頁面,這個(gè)頁面也和那一家廣告商合作,這個(gè)頁面也包含一張www.advertisement.com域名下的一張廣告圖ad3.jpg,當(dāng)請(qǐng)求這張ad3.jpg圖片的時(shí)候,瀏覽器就會(huì)向www.advertisement.com發(fā)送cookie

Cookie:? user="wang"; like="a"; buy="b"

這樣廣告公司就可以根據(jù)用戶的瀏覽習(xí)慣,給用戶推送合適的廣告。

安全

多數(shù)網(wǎng)站使用cookie作為用戶會(huì)話的唯一標(biāo)識(shí),因?yàn)槠渌姆椒ň哂邢拗坪吐┒础H绻粋€(gè)網(wǎng)站使用cookies作為會(huì)話標(biāo)識(shí)符,攻擊者可以通過竊取一套用戶的cookies來冒充用戶的請(qǐng)求。從服務(wù)器的角度,它是沒法分辨用戶和攻擊者的,因?yàn)橛脩艉凸粽邠碛邢嗤纳矸蒡?yàn)證。 下面介紹幾種cookie盜用和會(huì)話劫持的例子:

網(wǎng)絡(luò)竊聽

網(wǎng)絡(luò)上的流量可以被網(wǎng)絡(luò)上任何計(jì)算機(jī)攔截,特別是未加密的開放式WIFI。這種流量包含在普通的未加密的HTTP清求上發(fā)送Cookie。在未加密的情況下,攻擊者可以讀取網(wǎng)絡(luò)上的其他用戶的信息,包含HTTP Cookie的全部內(nèi)容,以便進(jìn)行中間的攻擊。比如:攔截cookie來冒充用戶身份執(zhí)行惡意任務(wù)(銀行轉(zhuǎn)賬等)。

解決辦法:服務(wù)器可以設(shè)置secure屬性的cookie,這樣就只能通過https的方式來發(fā)送cookies了。

DNS緩存中毒

如果攻擊者可以使DNS緩存中毒,那么攻擊者就可以訪問用戶的Cookie了,例如:攻擊者使用DNS中毒來創(chuàng)建一個(gè)虛擬的NDS服務(wù)h123456.www.demo.com指向攻擊者服務(wù)器的ip地址。然后攻擊者可以從服務(wù)器h123456.www.demo.com/img_01.png發(fā)布圖片。用戶訪問這個(gè)圖片,由于www.demo.com和h123456.www.demo.com是同一個(gè)子域,所以瀏覽器會(huì)把用戶的與www.demo.com相關(guān)的cookie都會(huì)發(fā)送到h123456.www.demo.com這個(gè)服務(wù)器上,這樣攻擊者就會(huì)拿到用戶的cookie搞事情。

一般情況下是不會(huì)發(fā)生這種情況,通常是網(wǎng)絡(luò)供應(yīng)商錯(cuò)誤。

跨站點(diǎn)腳本XSS

使用跨站點(diǎn)腳本技術(shù)可以竊取cookie。當(dāng)網(wǎng)站允許使用javascript操作cookie的時(shí)候,就會(huì)發(fā)生攻擊者發(fā)布惡意代碼攻擊用戶的會(huì)話,同時(shí)可以拿到用戶的cookie信息。

例子:

當(dāng)用戶點(diǎn)擊這個(gè)鏈接的時(shí)候,瀏覽器就會(huì)執(zhí)行onclick里面的代碼,結(jié)果這個(gè)網(wǎng)站用戶的cookie信息就會(huì)被發(fā)送到abc.com攻擊者的服務(wù)器。攻擊者同樣可以拿cookie搞事情。

解決辦法:可以通過cookie的HttpOnly屬性,設(shè)置了HttpOnly屬性,javascript代碼將不能操作cookie。

跨站請(qǐng)求偽造CSRF

例如,SanShao可能正在瀏覽其他用戶XiaoMing發(fā)布消息的聊天論壇。假設(shè)XiaoMing制作了一個(gè)引用ShanShao銀行網(wǎng)站的HTML圖像元素,例如,

<img? src = "http://www.bank.com/withdraw?user=SanShao&amount=999999&for=XiaoMing" >

如果SanShao的銀行將其認(rèn)證信息保存在cookie中,并且cookie尚未過期,(當(dāng)然是沒有其他驗(yàn)證身份的東西),那么SanShao的瀏覽器嘗試加載該圖片將使用他的cookie提交提款表單,從而在未經(jīng)SanShao批準(zhǔn)的情況下授權(quán)交易。

解決辦法:增加其他信息的校驗(yàn)(手機(jī)驗(yàn)證碼,或者其他盾牌)。






常用的會(huì)話跟蹤技術(shù)是Cookie與Session。Cookie通過在客戶端記錄信息確定用戶身份,Session通過在服務(wù)器端記錄信息確定用戶身份。

如果你把Cookies看成為http協(xié)議的一個(gè)擴(kuò)展的話,理解起來就容易的多了,其實(shí)本質(zhì)上cookies就是http的一個(gè)擴(kuò)展。有兩個(gè)http頭部是專門負(fù)責(zé)設(shè)置以及發(fā)送cookie的,它們分別是Set-Cookie以及Cookie。當(dāng)服務(wù)器返回給客戶端一個(gè)http響應(yīng)信息時(shí),其中如果包含Set-Cookie這個(gè)頭部時(shí),意思就是指示客戶端建立一個(gè)cookie,并且在后續(xù)的http請(qǐng)求中自動(dòng)發(fā)送這個(gè)cookie到服務(wù)器端,直到這個(gè)cookie過期。如果cookie的生存時(shí)間是整個(gè)會(huì)話期間的話,那么瀏覽器會(huì)將cookie保存在內(nèi)存中,瀏覽器關(guān)閉時(shí)就會(huì)自動(dòng)清除這個(gè)cookie。另外一種情況就是保存在客戶端的硬盤中,瀏覽器關(guān)閉的話,該cookie也不會(huì)被清除,下次打開瀏覽器訪問對(duì)應(yīng)網(wǎng)站時(shí),這個(gè)cookie就會(huì)自動(dòng)再次發(fā)送到服務(wù)器端。

Cookie實(shí)際上是一小段的文本信息??蛻舳苏?qǐng)求服務(wù)器,如果服務(wù)器需要記錄該用戶狀態(tài),就使用response向客戶端瀏覽器頒發(fā)一個(gè)Cookie。客戶端瀏覽器會(huì)把Cookie保存起來。當(dāng)瀏覽器再請(qǐng)求該網(wǎng)站時(shí),瀏覽器把請(qǐng)求的網(wǎng)址連同該Cookie一同提交給服務(wù)器。服務(wù)器檢查該Cookie,以此來辨認(rèn)用戶狀態(tài)。服務(wù)器還可以根據(jù)需要修改Cookie的內(nèi)容。

Cookie中保存中文只能編碼。一般使用UTF-8編碼即可。不推薦使用GBK等中文編碼,因?yàn)闉g覽器不一定支持,而且JavaScript也不支持GBK編碼。

###Cookie的有效期### Cookie的maxAge決定著Cookie的有效期,單位為秒(Second)。Cookie中通過getMaxAge()方法與setMaxAge(int maxAge)方法來讀寫maxAge屬性。 如果maxAge屬性為正數(shù),則表示該Cookie會(huì)在maxAge秒之后自動(dòng)失效。瀏覽器會(huì)將maxAge為正數(shù)的Cookie持久化,即寫到對(duì)應(yīng)的Cookie文件中。無論客戶關(guān)閉了瀏覽器還是電腦,只要還在maxAge秒之前,登錄網(wǎng)站時(shí)該Cookie仍然有效。下面代碼中的Cookie信息將永遠(yuǎn)有效。


https://my.oschina.net/xianggao/blog/395675?fromerr=GC9KVenE

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • HTTP cookie(也稱為web cookie,網(wǎng)絡(luò)cookie,瀏覽器cookie或者簡稱cookie)是網(wǎng)...
    留七七閱讀 18,376評(píng)論 2 71
  • 通過node.js建立了一個(gè)完整的網(wǎng)站不是一件容易的事,這涉及讀取頁面模板,從數(shù)據(jù)庫中抽出數(shù)據(jù)構(gòu)建成新的頁面返回給...
    R_X閱讀 312評(píng)論 0 0
  • 會(huì)話(Session)跟蹤是Web程序中常用的技術(shù),用來跟蹤用戶的整個(gè)會(huì)話。常用的會(huì)話跟蹤技術(shù)是Cookie與Se...
    chinariver閱讀 5,778評(píng)論 1 49
  • http://www.91ri.org/tag/fuzz-bug 通常情況下,有三種方法被廣泛用來防御CSRF攻擊...
    jdyzm閱讀 4,390評(píng)論 0 5
  • 1,基礎(chǔ) 1)Cookie在javax.servlet.http.Cookie下,一般由服務(wù)端來創(chuàng)建,用于在客戶端...
    沐兮_d64c閱讀 553評(píng)論 0 2

友情鏈接更多精彩內(nèi)容