PHP保持用戶(hù)登錄狀態(tài)的方法
1、將用戶(hù)信息,比如一個(gè)['uid'=>123, 'username'=>'testuser']的數(shù)組,序列化后成為字符串,使用可逆加密算法加密該字符串,寫(xiě)到一個(gè)Key為userinfo的COOKIE里。
2、由于可逆加密算法容易被解密,一旦加密的規(guī)則被別人猜測(cè)到以后,就可以輕易篡改這個(gè)COOKIE的內(nèi)容,然后自行根據(jù)加密規(guī)則加密后偽造。
所以,我們另外加入一個(gè)infodig的COOKIE,是將以上的userinfo的COOKIE內(nèi)容,加入salt后使用不可逆加密算法生成散列,至于salt咱們可以自己定,總之要對(duì)外保密,不可逆算法例如md5,甚至多次加鹽多次md5。
3、以上兩個(gè)COOKIE,為增強(qiáng)安全性,防止用戶(hù)被XSS攻擊后拿到,可以設(shè)置http-only屬性。
服務(wù)端判斷存在以上兩個(gè)COOKIE后
1、驗(yàn)證infodig與userinfo是否匹配(將userinfo的內(nèi)容使用生成infodig的方法計(jì)算后,與COOKIE傳上來(lái)的infodig匹配是否一致)
2、infodig驗(yàn)證通過(guò)后,使用解密算法解密userinfo串,得到用戶(hù)信息,如果用戶(hù)信息里的uid存在用戶(hù)表中,則寫(xiě)SESSION,通過(guò)SESSION保持本次會(huì)話(huà)
總結(jié):
使用COOKIE記錄用戶(hù)信息是可行的(當(dāng)然不建議把用戶(hù)敏感的東西存在COOKIE,例如郵箱、手機(jī)、甚至密碼,只記錄對(duì)登錄有用的部分,例如uid、username等標(biāo)識(shí),以及nickname可能會(huì)在某些地方提升用戶(hù)體驗(yàn)),可以確定的是,這個(gè)COOKIE對(duì)用戶(hù)可見(jiàn),我們要做的就是兩點(diǎn):
1、盡量讓用戶(hù)看不懂,而只有我們服務(wù)端自己認(rèn)識(shí)(可逆加密算法)
2、即使用戶(hù)看懂了,他也不能夠輕易的偽造(不可逆的散列算法)
推薦教程:PHP視頻教程