2009-12-09 45 views
5

當前正在使用會話登錄用戶。但是當我關閉瀏覽器並再次打開時,我必須再次登錄。你如何記住用戶登錄說2周。當他再次訪問同一頁面時保持用戶登錄?

它是通過cookies嗎?

+1

請問那些回答這個問題的人也可以考慮關於這個話題的安全問題嗎?例如,如何防止通過複製cookie自動登錄。謝謝。 – 2009-12-09 22:12:51

+0

然後至少提到使用會話的固有安全風險;) – Franz 2009-12-09 22:19:03

+0

您應該儘可能重新使用現有的身份驗證框架,因爲它確實很複雜。例如,看看https://github.com/delight-im/PHP-Auth – caw 2016-09-21 04:26:16

回答

0

是的。您使用Cookie來實現「自動登錄」(或「記住我」)功能。

This google search or SO search results,should point you to a right direction。

1

閱讀:http://www.php.net/manual/en/session.configuration.php

你需要的是session.cookie_lifetime設置。會話cookie(例如沒有生命週期的cookies)在瀏覽器關閉時被刪除。如果希望會話保持更長時間,請將該設置設置爲php.ini,httpd.conf.htaccess。甚至可能有ini_set

編輯:其實你可以使用此功能:

session_set_cookie_params (86400*30); 
session_start() 

86400 * 30爲30天。

在這裏看到:http://www.php.net/manual/en/function.session-set-cookie-params.php

9

所以你要選擇「在此計算機上記住我」?這裏有一個語言無關的方式,你可以怎麼做:

  1. 至少cookie_iduser_id列創建一個數據庫表。如有必要,還可添加cookie_ttlip_lock。列名自己說明了我的猜測。
  2. 第一次登錄時(如有必要,只有選中「記住我」選項),生成一個長的,唯一的,難以猜測的密鑰,它代表cookie_id,並將其與user_id一起存儲在DB中。還將此存儲爲具有之前指定的cookie名稱的cookie的cookie值。例如。 remember。給餅乾長壽,例如一年。
  3. 對每個請求,檢查用戶是否已登錄。如果不是,請檢查與cookie名稱remember相關的cookie值cookie_id。如果它存在且根據DB有效,則自動登錄與user_id相關聯的用戶並再次推遲cookie年齡。

至於安全風險,如果密鑰很長且混合不夠(至少30個混合字符),那麼強制登錄的機會可以忽略不計。此外,您可能已經瞭解了要使用的可選列ip_lock。它應該表示用戶的IP地址。你最終可以添加一個額外的複選框「鎖定登錄到這個IP(只有當你有一個靜態IP)」,這樣服務器可以使用用戶的IP地址作爲額外的驗證。

如果一個人沒有IP鎖的情況下劫持了用戶的cookie值會怎麼樣?那麼,對此沒什麼可做的。和它一起生活。 「記住我」的事情在每個論壇下都很有趣,帳號劫持不會在那裏造成太大的影響,但我絕對不會將它用於管理面板和那種控制服務器端內容的網頁。

這畢竟是相當直接的。祝你好運。

+0

我認爲將用戶代理存儲在數據庫中是一個好主意,因爲相同的用戶將是非常不合邏輯的想要在IE和Firefox中被記住。事實上,所有可以從請求中挖掘的東西都應該被存儲起來,以防止cookie被竊取,不是嗎? – 2009-12-09 23:39:10

+0

可行,但如果用戶升級了UA,則會失敗。 – BalusC 2009-12-10 01:52:41

+0

對於用戶來說,再次輸入他的詳細信息比侵入者獲得訪問權更好。 – 2009-12-10 13:39:34

相關問題