2009-07-28 57 views
2

關於限制登錄嘗試有幾個問題,但沒有人真正討論過存儲登錄嘗試記錄的優點,缺點或不同方式(大多數關注於例如,限制與驗證碼問題,這不是我感興趣的問題)。相反,我試圖找出將這些信息記錄在數據庫中的最佳方法,該數據庫很有用,但不會影響性能。設計數據庫以記錄失敗登錄以防止暴力破解

方法1)創建一個表,記錄:IP地址,用戶名嘗試和嘗試時間。然後,當用戶嘗試登錄時,我運行一個選擇來確定在過去5分鐘內用戶名被嘗試了多少次(或者最近5分鐘內某個特定IP地址嘗試了多少次)。如果超過一定數量,則要麼扼殺登錄嘗試,要麼顯示驗證碼。

這允許基於用戶名和IP地址進行限制(如果攻擊嘗試使用單個密碼嘗試許多不同的用戶名),並創建一個容易審覈的記錄,但每次登錄嘗試都需要INSERT,並且至少有一個額外的SELECT。

方法2)創建一個記錄失敗嘗試次數和上次登錄時間的類似表。這可能導致更小的數據庫表和更快的SELECT語句(不需要COUNT),但是提供了更少的控制和更少的數據進行分析。

方法3)類似於方法2,但將這些信息存儲在用戶表本身中。這意味着不需要額外的SELECT語句,儘管它會向用戶表添加額外的,也許不必要的信息。它也不會允許附加的控制和方法1提供的信息。

其他方法:將登錄嘗試存儲在mysql MEMORY表或sqlite內存表中。這會降低由於磁盤性能而導致的性能損失,但仍需要數據庫調用,並且不允許對登錄嘗試進行長期審計,因爲數據不會持久。

任何想法都可以做到這一點,或者你自己實施了什麼?

+0

我可以說將用戶名綁定到IP,這樣就不會因爲其他人試圖暴力破解帳戶而阻止有效的用戶? – Meep3D 2009-07-28 16:46:53

回答

2

這聽起來像你過早優化。

以其他開發人員期望實現它的方式實現它,然後衡量性能。如果您發現此時需要優化,請根據您的測量結果採取一些措施。

我希望方法#1是最自然的解決方案。

作爲一個方面說明:我會整齊地分離a)決定是否有人攻擊的代碼部分,b)決定採取何種措施。您可能會嘗試多次嘗試在優化查詢時正確使用此部分。

1

一些額外的簡單陳述不會有任何明顯的區別。相對而言,登錄很少見。如果你想確保自動登錄嘗試不會導致性能問題,你就必須有一個第二閾值之後,你

  • 時間戳濫用
  • 停止計數(並因此停止插入/更新)
  • 阻止IP幾個小時。

該閾值必須遠高於調節/引入驗證碼的閾值。

相關問題