2012-02-05 79 views
5

我在實施我自己的系統以禁止太多嘗試後,一直在研究此過去兩天。但我還沒有找到正在尋找的正確答案。最重要的是,實現這個目標的最好方法是什麼?過多登錄嘗試後實施禁令的最佳方法

目前我通過一個IP禁止執行這個,如果同一個IP連續10次登錄錯誤,IP被禁止30分鐘可以登錄,他們仍然可以瀏覽網站。但是,如果這種情況發生在人口密集的地區,比如大學校園,這難道不會有效地阻止整個學校登錄?

那麼有沒有更好的方式來做到這一點,即不使用IP地址?我以爲我可以用cookies來做,但用戶試圖暴力破解賬戶可能會每10次嘗試一次就刪除他們的cookies。

+0

你應該儘可能重新使用現有的身份驗證框架,因爲,真的,這是複雜的。例如,看一下https://github.com/delight-im/PHP-Auth,它既是框架不可知的,也是與數據庫無關的。它會自動調節,這正是您想要的。 – caw 2016-10-21 21:45:29

回答

4

我一次遵循的方法與我在銀行的電子銀行頁面遇到的方法類似。它禁止進一步登錄每次賬戶的時間增加,例如5次嘗試,例如等待10秒,1分鐘,5分鐘,15分鐘,然後等待30分鐘。 攻擊者通常以特定帳戶爲目標。每個IP地址也應該有一個全局規則,它在一定次數的嘗試之後鎖定登錄,這個規則必須大於5,比如說10.除了這兩個規則之外,還可以比較瀏覽器和cookie等,以提高容忍度。

+1

這個問題仍然存在,是否阻止了該IP上的所有用戶,並給他們增加了等待時間,這與我使用的實現已經有了相同的問題。 – JimmyBanks 2012-02-05 22:32:04

+0

我的意思是增加目標帳戶的等待時間,但不是針對其他人。只要可以,您也可以評估cookie。如果沒有曲奇,可以採取其他措施。沒有正確的客戶端信息的純粹的暴力破解攻擊只能通過IP或部分通過持久連接的IP:端口來阻止。 – Sam 2012-02-05 22:38:34

+0

哦,我明白你的意思了,是的,這將是非常有效的,我應該想到這一點;) – JimmyBanks 2012-02-05 23:40:39

5

創建帶有兩個字段「用戶」字段/外鍵和「時間戳」字段的名爲「failed_logins」的mysql表。

當用戶成功登錄時,刪除該用戶的所有「failed_logins」行。

當用戶未成功登錄時,使用當前時間戳在該用戶的「failed_logins」中創建一個新行。

在每次登錄嘗試給定用戶之前,檢查是否密碼正確/不正確的:

  • 運行一個查詢,刪除所有「failed_logins」行超過15分鐘(例如)。

  • 運行查詢,檢查用戶試圖登錄的failed_logins中的行數。如果> = 5(例如),請終止登錄嘗試,通知用戶他們已被鎖定在他們的帳戶之外,並稍後再嘗試。

結果: 用戶被鎖定他們的帳戶後的5 15分鐘內失敗的登錄嘗試。

-5

有時您需要爲受密碼保護的網站添加額外的保護。本文解釋瞭如何在三次登錄嘗試失敗後限制訪問登錄頁面。此架構使用訪問者IP地址在數據庫中存儲日誌嘗試,並在第三次嘗試失敗後阻止訪問登錄功能30分鐘。

http://webcheatsheet.com/php/blocking_system_access.php