2009-07-31 198 views
3

我有一個登錄系統需要用戶名和密碼。我想在一定數量的失敗登錄嘗試後顯示驗證碼。什麼是實施這個的正確方法?我在這個網站上閱讀過,有些解決方案建議在users表中添加一個'failed-attempts-count'。但是,我需要失敗的嘗試不被綁定到某個用戶 - 即我希望顯示驗證碼,而不管輸入的用戶名是否存在於系統中。將這個存儲在一個會話變量是好的(我正在使用PHP)?如果是這樣,那麼根據需要向會話變量中引入數據是否沒有缺點?我已經有網站上的每個訪問者的任何會話ID(無論是否登錄),所以我可以創建一個表,將登錄嘗試與此會話ID相關聯......有關最佳/最安全方法的任何想法?謝謝。限制登錄嘗試,無論用戶?

更新:從答案迄今爲止,它看起來像會話ID是不是最好的辦法,因爲黑客可以簡單地明確他/她的緩存(但是這是一個真正的問題,因爲難道不這樣減慢蠻力攻擊足以使其無用?)。另一種選擇是通過IP ......但我對內部網或代理下的用戶猶豫不決,因爲失敗的嘗試將被共享......我無法真正想到任何其他方法..你能嗎?

回答

6

使用會話ID的危險在於,有人撰寫蠻力攻擊可以在每次嘗試時清除自己的Cookie,從而爲他提供新的會話。

請記住,可以使用瀏覽器之外的腳本語言編寫自動化強力攻擊,以便操縱爲每個請求發送的Cookie。

另一種方法是創建一個包含用戶源IP的表並在其中添加計數器。這會給使用代理服務器的用戶帶來不便。但至少你會發現那些試圖反覆猜測來自同一地點的密碼的人。

更新:在連續的強力嘗試期間清除cookie不會減慢攻擊速度,因爲此過程將自動化並幾乎立即發生。這些類型的攻擊中的Cookie操作相當普遍。修改cookie不同於清除瀏覽器的緩存(通常需要一段時間,因爲它需要刪除一堆文件)。所有攻擊者需要做的是防止發送cookie。

1

如果黑客關閉瀏覽器並重新打開它,會話方法將不起作用,所以存儲失敗嘗試次數和最後一次嘗試次數的表(所以你可以檢查是否說一個小時過去了你可以重置計數器)每個用戶將是最安全的方式。

+0

沒錯,但我認爲首先考慮驗證碼的想法是阻止自動化的暴力攻擊..所以在每次嘗試解決問題後都不會關閉瀏覽器或清除緩存? – oym 2009-07-31 09:24:23

1

您可以使用IP和時間記錄所有失敗的嘗試。舊的失敗嘗試會在一段時間後被刪除,如果有一定數量的失敗嘗試給定IP,則顯示驗證碼。

1

安裝APC http://www.php.net/apc或內存緩存(d)http://www.php.net/memcache或這裏http://www.php.net/memcached(內存緩存也需要一個memcached服務器進行安裝,在這裏看到http://www.danga.com/memcached/),然後使用適當的增量壞的登錄嘗試從一個IP地址用的超時命令無論套房(5分鐘,30分鐘等)。這將允許您快速確定是否發生了暴力嘗試(無需擔心競賽狀況),並在確定的時間量之後自動終止該塊。

APC例如:

$max_attempts = 5; // max attempts before captcha 
$attempts = apc_fetch('login_attempts_'.$ip)); 
if($attempts and $attempts>$max_attempts){ 
    // block code here or redirect, captcha etc... also suggest a short sleep time to delay answer, slow down bot 
}else{ 
    // check login here, run next code if login fails 
    if($login_failed){ 
     if(!$attempts){ 
      apc_store('login_attempts_'.$ip,1,$timeout); 
     }else{ 
      // function NOT currently documented on php.net, increments number stored in key 
      apc_inc('login_attempts_'.$ip); 
     } 
    } 
} 

當然這是一個非常粗略的例子...但你有想法

0

你可以得到的最準確的信息是他們的IP地址。如果您希望它是準確的,請不要使用會話cookie,因爲用戶可能會忽略您的會話cookie(即使用curl)。但是,如果您擔心共享ips,您可以嘗試包含其他信息,例如瀏覽器代理或使用ajax來傳回您無法獲得的其他信息。但是,除IP地址以外的其他所有內容都可能被僞造(即使這樣,您也可以使用代理服務器)。