2011-08-18 29 views
2

我的登錄系統目前的工作原理如下:如何實現隱式註銷?

  1. 抓住用戶的用戶名和密碼從POST形式。
  2. 檢查數據庫的用戶名和salted +哈希密碼。
  3. 如果認證成功,則生成一個長且隨機的字母數字字符串。
  4. 將此字符串與用戶名一起存儲在MySQL以及$_SESSION變量中。
    • 這與僅將用戶密碼置於$_SESSION中相反。我覺得這樣會讓間諜軟件進入並竊取用戶的憑證。
  5. 在需要認證的每個網頁(例如非敏感帳戶設置,只有成員的地區,等等),檢查$_SESSION用戶名和串對那些存儲在MySQL。
  6. 如果它們匹配,請繼續並顯示頁面。否則,顯示登錄表單(?)
  7. 當用戶明確註銷時,從MySQL和$_SESSION中刪除隨機字符串。

我卡在的是如何處理當用戶隱式註銷。也就是說,當他/她關閉瀏覽器窗口而不點擊網站上的任何「註銷」按鈕時。我很確定我仍然需要從MySQL中刪除隨機字符串,所以有人不能使用被盜的cookie來登錄。但是,我怎麼知道用戶何時關閉瀏覽器窗口?

(「記住我」的功能是無關緊要的現在)

+0

你的隨機字符串本質上就像一個會話。爲什麼你將它存儲在'$ _SESSION'中而不是cookie?使用會話涉及文件系統訪問,並在處理請求期間獲得對會話文件的獨佔鎖定,阻止它在調用請求之前(或直到調用session_write_close())之前處理其他請求) - 基本上一切都變慢。由PHP創建的會話ID已經與隨機字符串幾乎相同......您最好將其直接存儲在cookie中。 – shesek

+0

讓會話過期。 http://stackoverflow.com/questions/3068744/php-session-timeout – BlueDog

回答

3

我應該如何實施登錄會話?

認證和會話管理是兩個不同的東西,儘管它們緊密地綁在一起,你似乎也在談論授權。

如果認證成功,則生成一個長且隨機的字母數字字符串。

爲什麼? PHP已經生成了一個隨機標識符(會話ID)。如果您想區分已驗證/未驗證的用戶和/或識別哪個用戶擁有當前會話,請將用戶名/用戶ID存儲在會話中。

把用戶的密碼在$ _SESSION變量

爲什麼你想做到這一點 - 一旦你驗證過的用戶,你永遠需要再次使用的密碼。

檢查$ _SESSION用戶名和字符串對那些存儲在MySQL

爲什麼?會話數據如何改變其他比通過你的代碼?如果您懷疑您的服務器端代碼可能被篡改,那麼您的操作無關緊要,系統將變得不安全。

當用戶明確地登出

...你明確地摧毀了會議。就這樣。

當您從命題刪除冗餘沒有必要隱式註銷後進行清理。

BTW:有一些安全問題,你有沒有在你的解決方案,特別是再生一個身份驗證請求後的會話ID。

+0

+1,但我認爲更好的解決方案是將他的隨機字符串作爲會話ID,方法是將其直接存儲在cookie中,而不是使用PHP的本地會話處理,這是有問題的。看到我對這個問題的評論。 – shesek

0

你可以使用上onClose事件會調用Ajax,終止會話......從來沒有嘗試過,但它應該工作:

$(window).unload(function() { 
    // ajax to kill the session 
}); 
+0

我從來沒有使用Ajax,我想避免添加更多的圖層到網站。 – Maxpm

+0

您可以簡單地使用'new Image()。src ='remove-session.php''向服務器發送請求。但是與執行'$ .get('remove-session.php')''沒有多大區別......基本上,只是以某種方式向服務器發送請求並在處理請求時刪除會話。 – shesek

+0

另外,如果您使用的是AJAX,請確保添加一些延遲或使請求同步。否則,瀏覽器可能會在服務器獲取請求之前停止請求。您還可以添加'ignore_user_abort(TRUE)',這樣即使瀏覽器關閉了連接,服務器也會繼續處理請求 - 但它在瀏覽器在完全發送請求之前關閉連接的情況下不會有幫助。 – shesek