1

我在我的Rails 3.0應用程序上使用Devise,並且我們目前已確認並可恢復打開。這些模塊要求用戶確認他們的電子郵件帳戶(可確認),並允許用戶通過發送電子郵件到他們的電子郵件帳戶(可恢復)重置他們的密碼。安全謎題:確認電子郵件和重置密碼

不幸的是,我們很難「設計」一種合理的安全策略,允許用戶在未確認其帳戶的情況下使用該站點。我們加強了安全以下要求:

  1. 確認您的賬戶需要簽字或簽字是這種情況並非如此,用戶A小心輸入惡意用戶B的錯誤的電子郵件地址,B會收到確認電子郵件鏈接,自動登錄,並從那裏通過「電子郵件重置密碼鏈接」重置密碼。要求B使用A的憑證登錄可以消除這種可能性。

  2. 通過電子郵件重置密碼需要確認電子郵件。這是因爲如果用戶A意外地輸入了錯誤的電子郵件地址,其中一個屬於惡意用戶B,那麼B將收到確認電子郵件鏈接並且知道A已經註冊了一個帳戶。因此B可以訪問該網站並使用重置密碼功能來更改帳戶上的密碼,並隨後可以確認其帳戶。要求確認的電子郵件地址消除了這種可能性。

所以一切都很好。除了當用戶A創建一個帳戶,並沒有確認他的帳戶,然後返回到該網站並忘記了他的密碼。這裏A被陷入循環依賴循環,重置密碼需要確認他的賬戶,但確認他的賬戶需要使用他忘記的密碼登錄。

兩個可能的解決方案:

  1. 要求用戶在登錄後立即確認他們的帳戶,這將創建更多的註冊摩擦,但消除了循環依賴。

  2. 允許用戶在沒有確認帳戶的情況下重置密碼,但不允許用戶在確認帳戶之前輸入敏感信息或執行重要操作。這樣一來,惡意用戶B的賬號劫持仍然是可能的,但是他無需任何有價值的信息或權力就可以控制賬號。

那裏有更好的解決方案嗎?公司如何處理這個問題?我已經使用了幾個不需要立即發送電子郵件確認的網站,所以如果我們能夠以不需要執行像#2這樣複雜的事情的方式來做到這一點,那將會很不錯。

謝謝!

+0

嘿。對此有何後續?我正在瀏覽過去的答案,看到這還沒有被接受的答案。你最終做出了決定,還是仍在設計? – Gray

回答

0

創建一種角色用戶身份驗證但未確認。在進行任何帳戶更改(例如重置密碼或電子郵件地址)之前要求用戶確認其帳戶並非不合理。

我認爲這裏的訣竅只是讓用戶確認帳戶而不登錄。如果用戶A輸入了錯誤的電子郵件地址,那麼您可以期望做什麼?盡力幫助他們在開始時輸入正確的電子郵件地址。對用戶來說這是一個相當不可原諒的罪過 - 他們應該知道如何放入他們的電子郵件地址。如果他們無法獲得電子郵件,並使用了錯誤的帳戶,最後的辦法是讓你做一些技術支持和/或給他們一些安全問題,以幫助他們恢復他們的帳戶。

點擊電子郵件中的「確認」鏈接後,應該要求他們登錄。 「感謝您確認您的帳戶,請登錄」。不要自動登錄,因爲這可能是一個安全問題,特別是如果他們有一個包含敏感信息的「個人資料」。

在未確認用戶忘記密碼的情況下。告訴他們,他們必須先確認他們的賬戶,並提出重新發送電子郵件。之後,讓他們選擇通過電子郵件重置密碼。這是笨重的,但用戶可能會理解,如果你解釋爲什麼他們必須經歷這一點。他們是忘記他們所有信息的人,所以他們不應該對你太苛刻。

+0

感謝您的回覆!我可能會誤解,但您的提案似乎仍允許惡意用戶劫持一個帳戶:用戶A輸入了錯誤的電子郵件地址並繼續使用該網站,輸入一些個人信息。後來惡意用戶B的電子郵件A意外輸入會收到他點擊的「確認您的帳戶」電子郵件。在您的建議下,系統確認帳戶但未登錄B.然後用戶B使用「忘記密碼?」。功能,該功能會將重置密碼鏈接發送到他的電子郵件地址。他重置密碼並進入A的帳戶! – oregontrail256

+0

@ oregontrail256我明白你的意思了,如果這真的是你的用戶羣的關注點,那麼你應該解釋這一點。或者讓他們在前面確認,或者在重置密碼之前回答安全問題。我的觀點是期望用戶輸入他們真實的電子郵件地址並不是不合理的。但是在激活賬戶之前,安全問題和確認是防止我看到的這種方式。 – Gray