2011-02-24 33 views
3

我正在使用php進行註冊/登錄系統。我想我已經完成了所有的初始登錄工作(用salt加密密碼,用db存儲...)。如何使用cookie保持已驗證的用戶持續存在

我的問題是關於保持記錄在頁面之間的用戶的初始登錄後。我的理解是,一種方法是在服務器上有一個會話表,它爲每個用戶存儲一個隨機唯一的ID,並將該ID存儲在用戶計算機上的cookie中。通過這種方式,他們加載的每個頁面都是在數據庫中查找其會話ID。

我不明白的是如何安全?不能有人嗅出身份證,然後僞裝成該用戶。有人甚至可以嘗試猜測ID。

我還讀到,如果ID在每次訪問頁面上更改,它會更好。這是如何增加安全性的?它似乎只會減少任何ID可以使用的時間量。

而且如何將任何這種變化的「記住我」的功能,將存儲時間長?

回答

3

你所描述的ID正是會話ID是什麼,除了這對你透明地將由PHP來處理(瀏覽器沿着這個會話ID傳送與Cookie)。

你所描述的安全漏洞正是firesheep需要的優勢。您可以通過確保所有通過身份驗證的請求發送到您的網站上,以防止會話ID被嗅探。這不僅包括登錄,它還包括經過身份驗證的用戶嘗試訪問頁面的任何時間(這意味着瀏覽器將傳遞經過身份驗證的會話ID)。

如果用戶試圖不通過SSL訪問一個頁面,您應該理想地重定向到一個SSL頁面,並給他們一個新的會話ID,因爲舊的人能受到損害。

+0

我不確定你的意思是透明地處理會話ID。我不必自己創建ID?如果是這樣,我在哪裏得到它,我將如何給他們一個新的? – Mike 2011-02-24 20:03:32

+1

在php中使用[session functions](http://php.net/manual/en/ref.session.php),你可以初始化重置或銷燬會話,PHP引擎會自動爲每個用戶分配一個唯一的會話ID,在服務器和瀏覽器之間來回傳遞,然後你可以在'$ _SESSION'數組中存儲任何你想要的內容,每次用戶請求一個頁面時,你的服務器都會查看是否存在一個$ _SESSION數組cookie並將恢復數據。 – 2011-02-24 20:08:07

0

的關鍵在於這樣一個系統,你不隨機產生的密鑰 - 您將使用的事實有關用戶的它,那些其他客戶端不會有知識 - 如用戶的IP地址,用戶-agent和會話ID。然後,您使用該密鑰和他們的會話ID(該密碼由PHP進行透明處理)對用戶進行身份驗證。