2010-01-08 48 views
0

長話短說,我正在開發一個內部報表引擎。它完全基於Web(利用PHP和各種AJAX技術),並通過我們的生產軟件解釋存儲在MySQL數據庫中的數據。它運行在Ubuntu 8.04服務器上,所有員工在該機器上都有一個linux用戶帳戶。我使用pam_auth設置了一個登錄系統,強制用戶使用他們的linux用戶帳戶登錄並確定他們是否屬於相應的組以訪問特定報告。PHP pam_auth和cookies

這部分工作很好,我的問題是使用cookie添加「記住我」功能。我希望用戶有一個30天的cookie,以便爲他們節省一些時間,每次他們的會話過期時都必須登錄。我編寫了代碼中的「記住我」部分,它存儲了這個cookie就好了。我只存儲他們的用戶名和密碼的md5散列。當需要重新驗證它們時,問題就來了。通常情況下,我只需通過將存儲的用戶名與數據庫中該用戶的密碼哈希進行比較來完成此操作。使事情複雜化的是我沒有直接訪問用戶名和密碼散列。它們全部存儲在/ etc/passwd和/ etc/shadow中,並且登錄由PAM模塊處理。 pam_auth需要純文本用戶名和純文本密碼。

看來我的唯一選擇是將密碼存儲爲純文本或者使用可逆加密,但我並不特別喜歡這兩種方法。

這裏有沒有更好的解決方案?

回答

0

您可以使用的另一個選項是PHP內置的會話管理。然後,需要在用戶計算機上設置的唯一cookie是會自動爲您執行的會話ID。

通過更改這兩個ini設置,您可以將PHP會話長度設置爲至少30天:'session.cookie_lifetime'和'session.gc_maxlifetime'。然後,一旦用戶登錄後,您可以在調用session_start()後存儲他們的用戶名以及何時在$ _SESSION超級全局數組中登錄。當用戶返回時,您可以檢查$ _SESSION數組中的值以查看他們是否已登錄,以及是否少於30天前。

現在,如果因爲其他原因您仍然需要PAM身份驗證,則必須將其密碼存儲在會話變量中,作爲明文或可逆加密。雖然這不理想,但它比用戶瀏覽器中的cookie更安全。欲瞭解更多信息請看PHP Session - Manual

+0

將會話生存期設置爲2592000(30天)會出現任何可能的問題嗎? – DWilliams 2010-01-11 16:32:15

+0

我不知道任何,我不認爲該文檔記錄任何,但我從來沒有嘗試過一個PHP會話很長。 – jlamp 2010-01-15 17:53:03