2013-03-20 240 views
1

這個問題本質上是語言不可知的,但在我的情況下,我使用PHP爲任何人想知道。記錄失敗的登錄嘗試

我想跟蹤用戶失敗的登錄嘗試次數,以便在X失敗嘗試後顯示CAPTCHA。唯一的辦法就是防止暴力攻擊。它不一定是一個非常安全的方式,只是令人討厭,無法推遲那些蠻橫的人。

我正在考慮創建會話變量$_SESSION['failedLoginAttempts'],並在每次檢測到失敗的登錄嘗試時增加它。攻擊者仍然可以替換瀏覽器或者刪除他的cookies來繼續前進,但是這會使他(即他用來執行暴力的任何工具)每次嘗試都浪費幾秒鐘的時間,因此嘗試的次數會很高降低。

從一秒鐘到一對夫婦的攻擊每分鐘將是理想的,那麼攻擊可以忽略不計。

這種方法是否正確或我錯過了什麼?另外,這些情況下的最佳做法是什麼?

+0

他們可能會跳到不同的用戶名。也許通過IP登錄? – ethrbunny 2013-03-20 21:57:31

回答

3

您最好將其記錄在附加到用戶標識的數據庫中。這是因爲一個堅定的攻擊者不會使用網絡瀏覽器進行暴力破解;用大多數任何語言構建腳本都非常簡單,它會重複登錄嘗試並完全忽略cookie,或者在每次嘗試後重置cookie。

+1

這是真的......但不會每次重置Cookie都會花費足夠的時間(甚至可能不到一秒)來阻止攻擊? 如果不是這樣,那麼記錄攻擊者的IP可能會更有效,並且阻止任何來自該IP的登錄嘗試幾個小時 – federicot 2013-03-20 22:05:22

+1

如果他們使用自定義腳本,重置Cookie所需的數量可以忽略不計時間(微秒)。您可以通過IP或用戶名跟蹤,但用戶名可能更有效。例如,我的辦公室大約有三百人在一個外部IP地址後面。因此,通過IP進行鎖定會產生很多誤報,其中同一IP登錄後的兩個人同時登錄會出現攻擊。 – Adrian 2013-03-21 13:46:15

+1

謝謝你的回答!是的,你可能是對的。只要防禦措施不會阻止帳戶(因此妨礙實際所有者訪問它),但是像驗證碼一樣,使用用戶名跟蹤是最有效的方法。 – federicot 2013-03-22 02:15:44

0

另外請記住,如果您在數據庫中存儲加密的密碼。

PHP或MySQL應該接受用戶輸入並加密。

例如(不是真實的,而不是安全的代碼)

$query = "SELECT * FROM user WHERE user = " . $_POST['username'] . " AND password " . sha512($_POST['password']); 

如果你的服務器最多可能需要在post請求8點MB的數據。該攻擊者可以將1 Mb作爲密碼發佈,試圖對DDOS進行加密以保持服務器的CPU處於高負載狀態。

+0

你不應該做'password ='。sha512($ _ POST ['password'])'',而是從表中選擇密碼,其中username = $ _POST ['username']',顯然會首先清理用戶輸入。然後比較數據庫中的內容與運行任何必要加密的密碼字段中發佈的內容。如果在LAMP設置中,您還應該有軟件防火牆和mod_security。 mod_security通常有助於處理大量的後期數據攻擊,而防火牆可能是針對DDoS的一個很好的解決方案。儘管如此,我覺得這個答案與OP的問題無關。 – Piero 2015-04-29 14:47:32