PHP網(wǎng)站中保持登錄狀態(tài)的功能是怎么做的健霹?

本文轉(zhuǎn)載自知乎用戶小雷回答

首先,基于以上幾位朋友提到的瓶蚂,SESSION信息存儲(chǔ)在服務(wù)端骤公,相對(duì)于存儲(chǔ)在客戶端的COOKIE更為安全,所以正常一般網(wǎng)站在用于“判斷用戶是否登錄”時(shí)扬跋,確實(shí)是使用SESSION阶捆,例如可以在SESSION里存儲(chǔ)如下一個(gè)數(shù)組:

//驗(yàn)證用戶名和密碼成功后
$_SESSION['userinfo'] = [
  'uid' => 123,
  'username' => 'testuser'
];

而后在需要驗(yàn)證登錄的地方加入類似如下判斷

if(empty($_SESSION['userinfo']) || empty($_SESSION['userinfo']['uid'])){
  //未登錄,引導(dǎo)登錄
}

以上是使用SESSION做用戶登錄的基本存儲(chǔ)和驗(yàn)證邏輯钦听,當(dāng)然實(shí)際開發(fā)過程中會(huì)將這部分的代碼封裝

我們都知道洒试,SESSION一般是通過在COOKIE里記錄一個(gè)KEY為PHPSESSIDCOOKIE來保持上下文的,而這個(gè)PHPSESSIDCOOKIE的有效期是設(shè)置為“會(huì)話”朴上,意味著關(guān)閉瀏覽器后該COOKIE被銷毀垒棋,相應(yīng)的后端SESSION也就銷毀,如圖
另外痪宰,由于PHP的Session本身就有GC的機(jī)制叼架,一般默認(rèn)1440秒內(nèi)頁面沒有刷新動(dòng)作(準(zhǔn)確的說是沒有新的請(qǐng)求來刷新該PHPSESSID的生命周期),該SESSION也就被自動(dòng)回收衣撬,伴隨著用戶的登錄就失效了乖订。

Alt text

而題主關(guān)注的是如何實(shí)現(xiàn)這個(gè)“記住我”的功能,首先具练,雖然COOKIE保存在客戶端乍构,不安全,易被偽造扛点,這是客觀存在的事實(shí)哥遮,但要實(shí)現(xiàn)這個(gè)“記住我”岂丘,還確實(shí)就得用到COOKIE,我們能做的是盡量去提高偽造的門檻眠饮。

這邊僅提供一個(gè)參考的設(shè)計(jì)方案奥帘,

1、將用戶信息仪召,比如一個(gè)['uid'=>123, 'username'=>'testuser']的數(shù)組翩概,序列化后成為字符串,使用可逆加密算法加密該字符串返咱,寫到一個(gè)Key為userinfo的COOKIE
2、由于可逆加密算法容易被解密牍鞠,一旦加密的規(guī)則被別人猜測(cè)到以后咖摹,就可以輕易篡改這個(gè)COOKIE的內(nèi)容,然后自行根據(jù)加密規(guī)則加密后偽造难述,所以萤晴,我們另外加入一個(gè)infodigCOOKIE,是將以上的userinfoCOOKIE內(nèi)容胁后,加入salt后使用不可逆加密算法生成散列店读,至于salt咱們可以自己定,總之要對(duì)外保密攀芯,不可逆算法例如md5屯断,甚至多次加鹽多次md5
3、以上兩個(gè)COOKIE侣诺,為增強(qiáng)安全性殖演,防止用戶被XSS攻擊后拿到,可以設(shè)置http-only屬性

服務(wù)端判斷存在以上兩個(gè)COOKIE
1年鸳、驗(yàn)證infodiguserinfo是否匹配(將userinfo的內(nèi)容使用生成infodig的方法計(jì)算后趴久,與COOKIE傳上來的infodig匹配是否一致)
2、infodig驗(yàn)證通過后搔确,使用解密算法解密userinfo串彼棍,得到用戶信息,如果用戶信息里的uid存在用戶表中膳算,則寫SESSION座硕,通過SESSION保持本次會(huì)話

總而言之,使用COOKIE記錄用戶信息是可行的(當(dāng)然不建議把用戶敏感的東西存在COOKIE涕蜂,例如郵箱坎吻、手機(jī)、甚至密碼,只記錄對(duì)登錄有用的部分笼裳,例如uid、username等標(biāo)識(shí)佛舱,以及nickname可能會(huì)在某些地方提升用戶體驗(yàn))诸尽,可以確定的是原杂,這個(gè)COOKIE對(duì)用戶可見,我們要做的就是兩點(diǎn):
1您机、盡量讓用戶看不懂穿肄,而只有我們服務(wù)端自己認(rèn)識(shí)(可逆加密算法);
2际看、即使用戶看懂了咸产,他也不能夠輕易的偽造(不可逆的散列算法)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市仲闽,隨后出現(xiàn)的幾起案子脑溢,更是在濱河造成了極大的恐慌,老刑警劉巖赖欣,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屑彻,死亡現(xiàn)場離奇詭異,居然都是意外死亡顶吮,警方通過查閱死者的電腦和手機(jī)社牲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悴了,“玉大人搏恤,你說我怎么就攤上這事∨冉唬” “怎么了挑社?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長巡揍。 經(jīng)常有香客問我痛阻,道長,這世上最難降的妖魔是什么腮敌? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任阱当,我火速辦了婚禮,結(jié)果婚禮上糜工,老公的妹妹穿的比我還像新娘弊添。我一直安慰自己,他們只是感情好捌木,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布油坝。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪澈圈。 梳的紋絲不亂的頭發(fā)上彬檀,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音瞬女,去河邊找鬼窍帝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诽偷,可吹牛的內(nèi)容都是我干的坤学。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼报慕,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼深浮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起眠冈,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤飞苇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后洋闽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡突梦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年诫舅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宫患。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡刊懈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出娃闲,到底是詐尸還是另有隱情虚汛,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布皇帮,位于F島的核電站卷哩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏属拾。R本人自食惡果不足惜将谊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渐白。 院中可真熱鬧尊浓,春花似錦、人聲如沸纯衍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瓦堵,卻和暖如春基协,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谷丸。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工堡掏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刨疼。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓泉唁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親揩慕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子亭畜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容