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