2010-07-04 202 views
4

我嘗試在y嘗試失敗後阻止登錄x分鐘。我已經計劃記錄用戶登錄,所以我想我可以使用相同的數據庫來計算是否需要阻止。X嘗試失敗後阻止登錄

我的問題:

  • 是否有意義使用相同的日誌表運行y的邏輯失敗的嘗試阻止?
  • 有些人只有失敗的嘗試表,我聽說他們只是遞增失敗的登錄數。這是沒有意義的,因爲它們存儲的都是失敗嘗試次數,而不是在什麼時間段內。 10分鐘內3次失敗嘗試與3天內3次失敗嘗試不同。時間跨度很重要嗎?在y時間間隔內x次失敗嘗試,週期或x次失敗嘗試後,你是否阻止?什麼是最好的時間框架?
  • 有人可以澄清最佳實踐方法嗎?
+0

我發現在兩次嘗試之間只需加倍延遲時間,所以前幾次嘗試很快,但過了一段時間它變得非常漫長,但Marko有很好的建議。 – 2010-07-04 23:25:15

+0

如果我們正確回答您的問題,請接受該答案。乾杯:) – Marko 2010-07-05 20:50:32

回答

7

你需要什麼叫密碼嘗試窗口。

基本上在數據庫中的2場,一個LastPasswordAttempt(日期時間)和PasswordAttemptCount(INT)

然後在每次登錄時,檢查當最後LastPasswordAttempt發生,如果它已經在過去比如10分鐘 - 遞增PasswordAttemptCount,否則將其重置爲0(或1,因爲他們剛剛失敗)。

在同樣的邏輯中,檢查PasswordAttemptCount是否等於5或更多,如果是 - 拒絕用戶訪問。你可以有第三個領域鎖定他們幾個小時或一天。

即CanLoginAfter(日期時間),您可以將其設置爲上次密碼嘗試的一天。

希望這有助於

+7

要警惕你如何去做這件事。如果你有一個公共站點,在用戶交互的情況下,這可以被用來惡意地將人員從他們自己的賬戶中鎖定出來。因此,要麼給合法用戶一些方法來取消鎖定 - 電子郵件或其他方式或使用更短的時間。否則你有時會讓用戶惱火。 – 2010-07-04 23:31:16

+1

我同意@MrXexxed - 當然他們將不得不猜測用戶名。 – Marko 2010-07-04 23:32:49

+0

@Marjo Ivanovski的確他們會。如果一個網站使用電子郵件或單獨的屏幕名稱輸入用戶名會更加困難,但仍然有網站的用戶名是屏幕名稱,並且在這種情況下,如果他們是發佈評論,帖子或其他任何內容的網站,可以使用反對他們。如果沒有,無論如何它都不是問題。 – 2010-07-04 23:35:33

1

一種方法是做到這一點:

  • user_lockout: user_id, expires_dt(可能是普通用戶表的一部分)
  • failed_login_log: user_id, dt(可能是另一個日誌表的一部分)

經過user_id的任何登錄嘗試後,請檢查以確保expires_dt過去或NULL。 (如果將來帳戶被鎖定)

登錄失敗後,將記錄插入failed_login_log,然後計算過去X分鐘內失敗的登錄次數(WHERE dt > DATE_SUB(NOW(), INTERVAL x MINUTES))。

如果該計數大於Y,則更新user_lockout.expires_dtNOW() + Z MINUTES

這允許您在X分鐘內嘗試Y次失敗後Z分鐘鎖定賬戶。