2014-06-05 41 views
2

我有一個網站,用戶可以登錄訪問受限制的頁面。我試圖儘可能保證安全,所以我儘量遵循「最佳實踐」。是否告訴用戶該帳戶已被鎖定安全風險?

爲了降低對登錄頁面的暴力攻擊風險,我只允許用戶嘗試登錄設定的次數。如果用戶未能登錄3次,則該帳戶被鎖定,並且在用戶再次登錄之前必須解鎖。

我的問題是我是否應該在登錄頁面告訴用戶賬戶被鎖定?

從可用性的角度來看,似乎是正確的做法來顯示一條消息告訴用戶帳戶已被鎖定。但是這不意味着攻擊者可以使用它來查找現有的用戶名嗎?

經過一次失敗的登錄嘗試後,我只向用戶顯示「用戶名和/或密碼不正確」的消息,即我永遠不會告訴用戶到底發生了什麼問題。我這樣做是因爲否則攻擊者可以通過嘗試大量查找現有用戶名,並查看錯誤消息從「錯誤的用戶名」更改爲「錯誤的密碼」的時間。這是我讀過的關於安全性的文章推薦的。但是,如果我告訴用戶帳戶被鎖定時,我是否會陷入同樣的​​境地?攻擊者可以三次嘗試大量用戶名,並且如果顯示該帳戶被鎖定的消息,則攻擊者知道該用戶名有帳戶。

我會一直髮送一封電子郵件給賬戶已被鎖定的用戶,但我相信用戶不一定會立即看到該郵件,並且可能會繼續嘗試登錄,即使該賬戶已被鎖定。我認爲這會給用戶帶來一些煩惱,特別是如果他們知道他們正在使用正確的憑證,並且仍然收到證書無效的消息(實際上帳戶被鎖定,所以證書無關緊要)。

那麼我應該怎麼做?你是怎麼實現這個的?

+2

鎖定3次嘗試:內置DOS攻擊。我所需要做的就是嘗試3次,並鎖定了一位用戶。 *任何*用戶。 –

+2

黑名單,而不是用戶,這是更好的方法。當然,確定它不是微不足道的,例如。黑名單IP作品,但只是部分。 –

+2

更長的討論:http://security.stackexchange.com/questions/487/why-do-sites-implement-locking-after-3-failed-password-attempts –

回答

1

從可用性的角度來看,它似乎是正確的做法來顯示一條消息告訴用戶該帳戶已被鎖定。但是這不意味着攻擊者可以使用它來查找現有的用戶名嗎?

取決於你是如何實現它 - 如果你只顯示有效帳戶的消息,那麼這將是一個username enumeration漏洞。

但是,如果您將所有登錄嘗試與用戶表分開存儲,那麼您也可以爲無效帳戶顯示虛假帳戶鎖定消息。

例如記錄所有的嘗試

Date/Time  Username Successful 
06/06/14 10:00 foo   false 
06/06/14 10:01 foo   false 
06/06/14 10:02 bar   false 
06/06/14 10:03 foo   false 

其中bar是一個有效的用戶和foo沒有 - 但如果有人試圖再次登錄爲Foo現在你可以檢查日誌的最後30分鐘,並顯示Foo: Your account has been locked.

另請注意,如果您將其鎖定,也可以將其視爲對有效用戶的DoS攻擊類型。更好的方法可能是針對相同的用戶名或來自同一IP地址的限制重複嘗試。這應該並行執行,以防止攻擊者使用多個線程來擊敗你的限制。

相關問題