什麼是cookie
皇家國際:www.lanshiliu.com
cookie,即小餅乾,是儲存在使用者代理端(瀏覽器是最常見的使用者代理)的一些資料片段。瀏覽網頁時,瀏覽器會將當前頁面有效的 cookie放在請求的頭部傳送到服務端。
\
cookie組成
cookie由以下幾部分組成:
-
domain,cookie所屬的域名。瀏覽器傳送cookie時,
會檢查cookie所屬的域名,相符才會傳送。
瀏覽器會將tlanyan.me域下的cookie傳送到www.tlanyan.me
或者dev.tlanyan.me的頁面請求中,但不會傳送給www.baidu.com
。同樣,dev.tlanyan.me的cookie不能傳送給tlanyan.me,
因為限定了域名為dev子域。
-
path,cookie所屬路徑。設定為/author中的cookie不會發
送到/category路徑下,但是設定路徑為/的cookie會傳送到所有頁
面請求。
-
name, cookie的名稱(鍵名)。
-
value, cookie的值(內容)。
-
expires,過期時間。
-
secure,是否僅在https時才會傳送該cookie。
-
httponly,是否只用作http傳遞用。當設定為true時,瀏覽器端的腳
本語言將無法訪問到該cookie。
cookie的用途
cookie主要用在以下方面:\
-
http是無狀態的協議,為了維持會話需要額外的資料做標記,
cookie是最常用的手段。常見的PHPSESSID和JSESSIONID這兩
類cookie,分別用在PHP和Java web應用中維持會話。
-
有些資料需要存放在客戶端,cookie是一種選擇。使用者勾選“下次不
再提示”後,該標誌可儲存到客戶端,再次訪問程式讀取設定再決定
是否顯示。隨著HTML 5的普及,這部分功能正慢慢被localStorage
取代。
PHP端的cookie操作
讀取cookie可以通過$_COOKIE超全域性變數讀取到使用者端傳來的所有cookie。$_COOKIE是一個陣列,可以遍歷讀取傳送過來的cookie的名稱和值。瀏覽器只傳送了cookie的鍵值到服務端,故而無法讀取到cookie的domain/path/exipres等資訊,因為。\
PHP提供了setcookie函式來傳送cookie到客戶端。setcookie的函式簽名是:
bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )
引數與cookie的組成內容相對應: expires預設為0,表示僅當前會話有效,使用者關閉瀏覽器後該cookie將被清除;path預設為當前頁面路徑,即網址最後一個反斜槓前的部分;domain預設為當前頁面的域名,如果要擴大使用範圍,可設定為父級域名或者頂級域名; httponly預設為false,建議設定為true避免XSS攻擊。\
刪除cookie,只需要設定cookie的expires為過去的時間戳即可,例如 time() – 3600。所以要刪除foo這個cookie,程式碼可以為:
setcookie('foo', '', time() - 3600);
cookie的良好實踐
從cookie字面意思便可看出,儲存的是資料片段。web開發中cookie使用的頻率比較高,應該多加以理解。以下是一些使用cookie的良好實踐:\
-
不應該在cookie中儲存過大和過多的資料;
-
cookie在客戶端和傳輸中是明文可見的,不應該在cookie中儲存敏
感資訊;
-
為了站點和使用者安全,儘可能將cookie的httponly屬性設定為true;
-
cookie是客戶端完全控制的,也屬於外部輸入,服務端不可盲目
相信,應對其進行過濾。
其他
cookie是隨請求傳送而來,隨響應而設定到客戶端。理解了這個過程,就可以明白一些新手常見的問題,例如以下程式碼:
if (!isset($_COOKIE['foo']) {
在未設定foo這個cookie的情況下,第5行執行會出錯。原因在於setcookie是設定本次響應的cookie資訊,需要瀏覽器接收到響應並設定後,才能在後續的請求中附帶上該cookie,並沒有反應到本次請求上。\
同理,cookie存在於請求和響應的頭部資訊中,而頭部應該在請求正文之前,所以setcookie的函式上下文使用限制同header函式,即:在此之前不能已經傳送過響應正文。