PHP中cookie知識(shí)點(diǎn)學(xué)習(xí)
什么是cookie
cookie,即小餅干,是保存在用戶代理端(瀏覽器是最常見(jiàn)的用戶代理)的一些數(shù)據(jù)片段。瀏覽網(wǎng)頁(yè)時(shí),瀏覽器會(huì)將 當(dāng)前頁(yè)面有效的 cookie放在請(qǐng)求的頭部發(fā)送到服務(wù)端。
cookie組成
cookie由以下幾部分組成:
domain,cookie所屬的域名。瀏覽器發(fā)送cookie時(shí),會(huì)檢查cookie所屬的域名,相符才會(huì)發(fā)送。瀏覽器會(huì)將tlanyan.me域下的cookie發(fā)送到www.tlanyan.me或者dev.tlanyan.me的頁(yè)面請(qǐng)求中,但不會(huì)發(fā)送給www.baidu.com。同樣,dev.tlanyan.me的cookie不能發(fā)送給tlanyan.me,因?yàn)橄薅擞蛎麨閐ev子域。
path,cookie所屬路徑。設(shè)置為/author中的cookie不會(huì)發(fā)送到/category路徑下,但是設(shè)置路徑為/的cookie會(huì)發(fā)送到所有頁(yè)面請(qǐng)求。
name, cookie的名稱(鍵名)。
value, cookie的值(內(nèi)容)。
expires,過(guò)期時(shí)間。
secure,是否僅在https時(shí)才會(huì)傳送該cookie。
httponly,是否只用作http傳遞用。當(dāng)設(shè)置為true時(shí),瀏覽器端的腳本語(yǔ)言將無(wú)法訪問(wèn)到該cookie。
cookie的用途
cookie主要用在以下方面:
http是無(wú)狀態(tài)的協(xié)議,為了維持會(huì)話需要額外的數(shù)據(jù)做標(biāo)記,cookie是最常用的手段。常見(jiàn)的PHPSESSID和JSESSIONID這兩類cookie,分別用在PHP和Java web應(yīng)用中維持會(huì)話。
有些數(shù)據(jù)需要存放在客戶端,cookie是一種選擇。用戶勾選“下次不再提示”后,該標(biāo)志可保存到客戶端,再次訪問(wèn)程序讀取設(shè)定再?zèng)Q定是否顯示。隨著HTML 5的普及,這部分功能正慢慢被localStorage取代。
PHP端的cookie操作
讀取cookie可以通過(guò)$_COOKIE超全局變量讀取到用戶端傳來(lái)的所有cookie。$_COOKIE是一個(gè)數(shù)組,可以遍歷讀取發(fā)送過(guò)來(lái)的cookie的名稱和值。瀏覽器只發(fā)送了cookie的鍵值到服務(wù)端,故而無(wú)法讀取到cookie的domain/path/exipres等信息,因?yàn)椤?/p>
PHP提供了setcookie函數(shù)來(lái)發(fā)送cookie到客戶端。setcookie的函數(shù)簽名是:
bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )
參數(shù)與cookie的組成內(nèi)容相對(duì)應(yīng): expires默認(rèn)為0,表示僅當(dāng)前會(huì)話有效,用戶關(guān)閉瀏覽器后該cookie將被清除;path默認(rèn)為當(dāng)前頁(yè)面路徑,即網(wǎng)址最后一個(gè)反斜杠前的部分;domain默認(rèn)為當(dāng)前頁(yè)面的域名,如果要擴(kuò)大使用范圍,可設(shè)置為父級(jí)域名或者頂級(jí)域名; httponly默認(rèn)為false,建議設(shè)置為true避免XSS攻擊。
刪除cookie,只需要設(shè)置cookie的expires為過(guò)去的時(shí)間戳即可,例如 time() – 3600。所以要?jiǎng)h除foo這個(gè)cookie,代碼可以為
setcookie('foo', '', time() - 3600);
cookie的良好實(shí)踐
從cookie字面意思便可看出,保存的是數(shù)據(jù)片段。web開(kāi)發(fā)中cookie使用的頻率比較高,應(yīng)該多加以理解。以下是一些使用cookie的良好實(shí)踐:
不應(yīng)該在cookie中保存過(guò)大和過(guò)多的數(shù)據(jù);
cookie在客戶端和傳輸中是明文可見(jiàn)的,不應(yīng)該在cookie中保存敏感信息;
為了站點(diǎn)和用戶安全,盡可能將cookie的httponly屬性設(shè)置為true;
cookie是客戶端完全控制的,也屬于外部輸入,服務(wù)端不可盲目相信,應(yīng)對(duì)其進(jìn)行過(guò)濾。
其他
cookie是隨請(qǐng)求發(fā)送而來(lái),隨響應(yīng)而設(shè)置到客戶端。理解了這個(gè)過(guò)程,就可以明白一些新手常見(jiàn)的問(wèn)題,例如以下代碼:
if (!isset($_COOKIE['foo']) { setcookie('foo', 'foobar'); } $foo = $_COOKIE['foo'];
在未設(shè)置foo這個(gè)cookie的情況下,第5行運(yùn)行會(huì)出錯(cuò)。原因在于setcookie是設(shè)置本次響應(yīng)的cookie信息,需要瀏覽器接收到響應(yīng)并設(shè)置后,才能在后續(xù)的請(qǐng)求中附帶上該cookie,并沒(méi)有反應(yīng)到本次請(qǐng)求上。
同理,cookie存在于請(qǐng)求和響應(yīng)的頭部信息中,而頭部應(yīng)該在請(qǐng)求正文之前,所以setcookie的函數(shù)上下文使用限制同header函數(shù),即:在此之前不能已經(jīng)發(fā)送過(guò)響應(yīng)正文。
- 詳解cookie驗(yàn)證的php應(yīng)用的一種SSO解決辦法
- PHP與JavaScript針對(duì)Cookie的讀寫(xiě)、交互操作方法詳解
- PHP利用Cookie設(shè)置用戶30分鐘未操作自動(dòng)退出功能
- PHP中Cookie的使用詳解(簡(jiǎn)單易懂)
- php及codeigniter使用session-cookie的方法(詳解)
- PHP如何讀取由JavaScript設(shè)置的Cookie
- PHP設(shè)置Cookie的HTTPONLY屬性方法
- php cookie用戶登錄的詳解及實(shí)例代碼
- php頁(yè)面跳轉(zhuǎn)session cookie丟失導(dǎo)致不能登錄等問(wèn)題的解決方法
- php cookie 詳解使用實(shí)例
- PHP Cookie學(xué)習(xí)筆記
相關(guān)文章
PHP實(shí)現(xiàn)統(tǒng)計(jì)代碼行數(shù)小工具
這篇文章主要為大家詳細(xì)介紹了PHP實(shí)現(xiàn)統(tǒng)計(jì)代碼行數(shù)小工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09PHP快速排序算法實(shí)現(xiàn)的原理及代碼詳解
在本篇文章里小編給大家整理了關(guān)于PHP快速排序算法實(shí)現(xiàn)的原理及代碼相關(guān)知識(shí)點(diǎn),需要的朋友們跟著學(xué)習(xí)下。2019-04-04PHP正則表達(dá)式函數(shù)preg_replace用法實(shí)例分析
這篇文章主要介紹了PHP正則表達(dá)式函數(shù)preg_replace用法,結(jié)合實(shí)例形式分析了PHP正則表達(dá)式函數(shù)preg_replace基本功能、參數(shù)描述與相關(guān)使用技巧,需要的朋友可以參考下2020-06-06PHP基于mcript擴(kuò)展實(shí)現(xiàn)對(duì)稱加密功能示例
這篇文章主要介紹了PHP基于mcript擴(kuò)展實(shí)現(xiàn)對(duì)稱加密功能,結(jié)合實(shí)例形式簡(jiǎn)單分析了php使用mcript擴(kuò)展進(jìn)行加密與解密相關(guān)操作技巧,需要的朋友可以參考下2019-02-02PHP結(jié)合JQueryJcrop實(shí)現(xiàn)圖片裁切實(shí)例詳解
這篇文章主要介紹了PHP結(jié)合JQueryJcrop實(shí)現(xiàn)圖片裁切實(shí)例,非常實(shí)用的一個(gè)功能,需要的朋友可以參考下2014-07-07