2009-06-24 140 views
4

所以,我一直在玩asp:PasswordRecovery,我發現我真的不喜歡它,有以下幾個原因:密碼恢復,而不通過電子郵件發送密碼

1)Alice的密碼,甚至可以無需訪問重置愛麗絲電子郵件。密碼重置的安全問題緩解了這一點,但並不能真正讓我滿意。

2)Alice的新密碼以明文形式發回給她。我寧願給她發一個特殊的鏈接到我的網頁上(例如像example.com/recovery.aspx?P=lfaj0831uefjc這樣的網頁),這會讓她改變她的密碼。

我想我可以通過創建某種類型的過期密碼恢復頁面表並將這些頁面發送給要求重置的用戶來完成此操作。不知何故,這些頁面也可能會在後臺更改用戶密碼(例如,通過手動重置它們,然後使用新密碼的文本更改密碼,因爲如果不知道舊密碼,就不能更改密碼)。我相信其他人以前曾經遇到這個問題,這種解決方案讓我覺得有點難以理解。有一個更好的方法嗎?

理想的解決方案不是通過直接訪問數據庫來違反封裝,而是使用數據庫中現有的存儲過程......儘管這可能是不可能的。

回答

4

我目前在Spring + SpringSecurity之上實現了一個開源的user management system,這裏是我解決密碼丟失問題的方法。

  1. 用戶的帳戶必須具有預先註冊的電子郵件地址。
  2. 要請求重置,用戶將其帳戶名稱輸入到表單中。
  3. 生成一個臨時「重置代碼」並將其附加到該帳戶,並通過電子郵件發送給嵌入在超鏈接中的用戶。
  4. 收到電子郵件後,用戶點擊鏈接,將其帶到頁面以輸入新密碼。
  5. 在接受新密碼之前,會根據存儲的代碼檢查重置代碼(來自鏈接),以確保它是正確的並且沒有過期。

這樣可以避免在電子郵件中發送密碼(清除)。而且它還可以防止一個人重置另一個人的密碼,這只是一個麻煩,因爲密碼重置只發生在鏈接使用後。

但它確實依賴於用戶的電子郵件帳戶是安全的,並且電子郵件在傳輸過程中不被窺探。對於某些應用來說,這可能是不可接受的風險。

另一個等式是您需要非常小心地更改用戶的註冊電子郵件地址。至少,用戶必須輸入其當前的密碼以及更改地址的請求......以防止通過無人蔘與登錄會話進行黑客攻擊。

+0

嗯,這與我的問題表明我可以做的幾乎相同。 – Brian 2010-04-02 19:26:04

2

我建議添加額外的檢查級別,這裏有一些選項可供選擇。

  1. 首先,您可以將請求者的IP地址保存到數據庫中,然後當他們單擊重置鏈接時將其與當前機器的IP地址相比較,如果它們匹配,則重置密碼。如果電子郵件被攔截,那麼試圖重置密碼的人必須具有匹配的IP地址。
  2. 使用cookie並存儲一個唯一值,可能是一個GUID,MD5哈希值或其他值。因此,當用戶發出密碼重置請求時,cookie會存儲在他們的機器和數據庫中,當用戶單擊鏈接時,本地cookie必須與數據庫值匹配,否則他們將無法重置密碼。

一般來說,我完全反對在Email中發送密碼,所以我喜歡密碼重置鏈接選項而不是新的純文本密碼。

相關問題