關於限制登錄嘗試有幾個問題,但沒有人真正討論過存儲登錄嘗試記錄的優點,缺點或不同方式(大多數關注於例如,限制與驗證碼問題,這不是我感興趣的問題)。相反,我試圖找出將這些信息記錄在數據庫中的最佳方法,該數據庫很有用,但不會影響性能。設計數據庫以記錄失敗登錄以防止暴力破解
方法1)創建一個表,記錄:IP地址,用戶名嘗試和嘗試時間。然後,當用戶嘗試登錄時,我運行一個選擇來確定在過去5分鐘內用戶名被嘗試了多少次(或者最近5分鐘內某個特定IP地址嘗試了多少次)。如果超過一定數量,則要麼扼殺登錄嘗試,要麼顯示驗證碼。
這允許基於用戶名和IP地址進行限制(如果攻擊嘗試使用單個密碼嘗試許多不同的用戶名),並創建一個容易審覈的記錄,但每次登錄嘗試都需要INSERT,並且至少有一個額外的SELECT。
方法2)創建一個記錄失敗嘗試次數和上次登錄時間的類似表。這可能導致更小的數據庫表和更快的SELECT語句(不需要COUNT),但是提供了更少的控制和更少的數據進行分析。
方法3)類似於方法2,但將這些信息存儲在用戶表本身中。這意味着不需要額外的SELECT語句,儘管它會向用戶表添加額外的,也許不必要的信息。它也不會允許附加的控制和方法1提供的信息。
其他方法:將登錄嘗試存儲在mysql MEMORY表或sqlite內存表中。這會降低由於磁盤性能而導致的性能損失,但仍需要數據庫調用,並且不允許對登錄嘗試進行長期審計,因爲數據不會持久。
任何想法都可以做到這一點,或者你自己實施了什麼?
我可以說將用戶名綁定到IP,這樣就不會因爲其他人試圖暴力破解帳戶而阻止有效的用戶? – Meep3D 2009-07-28 16:46:53