2010-08-09 89 views
2

我被告知,將cookie,密碼,用戶名和用戶ID等內容存儲在cookie中是不安全的,相反,您應該將sessionID存儲在cookie中。這是我迷失的地方。使用會話ID訪問會話數據

我的目標是擁有一個基本的「記住我」功能。通常我會將用戶登錄信息存儲在cookie中,但由於這是不安全的,我想知道替代方法是什麼。我知道每次創建會話時,都會創建一個創建唯一ID的cookie,但在關閉瀏覽器時會過期。那麼如何在瀏覽器關閉後訪問此會話信息?

所有幫助表示讚賞。

回答

2

可能是最好的方法,因爲已經建議和大多數第三方應用程序做的,是創建一個具有以下字段的「user_sessions」數據庫表:

session_id (var_char) 
user_id (int) 
ip_address (var_char) 
last_logged_in (unix timestamp) 

然後使用Cookie來存儲任何的MD5哈希你喜歡的,可能是:

md5($username.$ip); //since md5 has a lot of reverse look ups now you should use a number of fields to validate. You could use a different crypto function to make it more difficult to crack, but md5 is the simplest version available in all php versions. 

編輯:你會再從cookie與數據庫SESSION_ID,看看他們是否已經登錄比較存儲的散列到coupl結合的原因。在md5函數中的字段是創建一個不太「可猜測的」散列格式。這使得不太可能有人能夠編輯cookie並以其他人身份登錄。

這可以爲所有用戶完成(這樣您可以跟蹤誰在線),並在cookie中設置一個「持久」登錄變量。例如。

p_login=true || p_login=false 

這樣你就會知道是否自動登錄或強制登錄。

注意:您可以查看http://www.openwall.com/articles/PHP-Users-Passwords,以獲取散列密碼,session_ids和用戶的不同方式。

+0

感謝!幾個問題: sessionID是否與cookie中存儲的內容相同('md5($ username.ip);')? // 根據您的示例,IP地址似乎用於身份驗證,因此如果其IP地址更改(代理),他們將不得不再次登錄,請更正? (不是問題,只是好奇而已。)// 另外,last_logged_in字段的用途究竟是什麼? (再次,只是好奇嗎?) – williamg 2010-08-09 03:36:33

+0

IP地址是唯一的哈希反對。用戶更可能意識到你只是在散列一個用戶名。然後,他們可以破解cookie並以任何人的身份登錄。如果它是md5($ username。$ ip),那麼計算散列值會更困難。 如果IP作爲md5哈希值存儲在cookie中,它會發生變化。所以你只需檢查會話是否存在於session_id ='md5($ username。$ id)'中。如果不創建它。如果它使用新的IP地址和散列進行更新。 存儲上次登錄時間和IP只是爲了安全。如果未經授權的訪問可以檢查。 – User123342234 2010-08-09 03:53:26

+0

更新我的答案以澄清更多。 – User123342234 2010-08-09 03:56:40

2

這可能是一個相當陡峭的學習曲線。您是否考慮過使用預先存在的CMS或其他解決方案來實現您想要實現的目標,甚至是可能包含此功能的框架?

對於「記住我」功能,您可以發送包含用戶標識的Cookie,並使用某個已知但祕密的標記再次散列該用戶的散列密碼。但是,該解決方案不允許您遠程過期某人的登錄,但不會重置某人的密碼。

因此,另一種方法是爲該用戶的登錄生成一個唯一標記,並具有另一個將該唯一標記與特定用戶和終止日期關聯的數據庫表。

+0

絕對是後一種方法...... – 2010-08-09 03:02:03

+0

但是不會使用令牌與存儲密碼或用戶ID一樣脆弱? – williamg 2010-08-09 03:07:23

+0

關於你的迴應的第一部分,我已經考慮過使用模板,但是我沒有理由。主要是,我喜歡自己做,我喜歡學習如何做到這一點。在我看來,除非我自己做,否則我不會學會如何去做。 (我自己做的是指學習如何在網絡上做,或者從SO這裏的優秀人員那裏學習) – williamg 2010-08-09 03:08:33