2009-09-13 49 views
1

好的,你有登錄表單,如果他們的密碼/用戶錯誤,你想禁止用戶5分鐘。 用戶可以連續嘗試幾次,直到被禁止。正在做臨時禁止

LOGIN_FAILS表:

  • ID PK,串行/ AUTO_INCREMENT
  • ip地址INT /文本/不管你喜歡
  • 添加DATETIME/TIMESTAMP

SQL:

SELECT IF(COUNT(id) < 3, 'false', 'true') AS is_banned FROM LOGIN_FAILS WHERE ipaddress='1.2.3.4' AND added BETWEEN (NOW() - INTERVAL '5 minutes') AND NOW(); 

這可以是vi sualized作爲

班檢查timeblock:#####

失敗:1,2,3

失敗都設置爲時間範圍:

Time -> 
========1==2=3========== 
========######========== 

現在你可以一次再試一次在一排:

========1######========= 

現在你可以連續兩次再試一次:

========1==2######====== 

但正確的做法將舉行5分鐘

該區間
========######========== 

現在,您可以三次嘗試再次連續

========1==2=3######==== 
     ^^^^^^ Ignored 

但你不希望使用當前時間作爲塊(0:00-0:05,0:05-0:10等),因爲如果禁令在0:04發生,則下一個禁止檢查時間塊爲0:05(=僅禁止1分鐘)。

那麼必須對給定的SQL語句添加/修改什麼,以便用戶可以總是連續嘗試N次,然後暫時禁止X分鐘?

編輯

因此,像

SELECT 
    IF(COUNT(id) < 3, 'false', 'true') AS is_banned 
FROM 
    LOGIN_FAILS 
WHERE 
    ipaddress='1.2.3.4' AND 
    added 
    BETWEEN 
    (
    SELECT 
     MIN(added) AS min 
    FROM 
     LOGIN_FAILS 
    WHERE 
     ipaddress='1.2.3.4' AND 
     added <= (NOW() - INTERVAL 5 minutes) 
    ORDER BY 
     added 
    LIMIT 3 
) 
    AND 
    NOW() 
+0

問題在哪裏? – McAden 2009-09-13 03:18:49

+0

添加了問題。我認爲已經很明顯:) – raspi 2009-09-13 03:25:50

回答

1

你的問題是漫長的,我承認,我掙扎,苦苦思索你在問什麼。我相信你問:如果我檢查「最近X分鐘內有多少次失敗?」那麼鎖定只會持續到最近的故障失敗;我如何確保它始終持續5分鐘?

如果這就是你要求的,那麼這裏是一個相當簡單的方法:在每次登錄失敗時,詢問數據庫「最近X分鐘內有多少失敗?」。如果這些數據加上失敗的數據是3或更多,那麼在用戶的數據庫行中設置一個列 - 例如locked_until,現在爲+5分鐘。

現在,修改您的登錄代碼以首先檢查帳戶是否被鎖定。

+0

是的,這就是我想問的。但不是用戶帳戶,而是IP地址。 – raspi 2009-09-13 03:59:33

+0

同一主體。只需使用鎖定時間戳創建IP地址的鎖定記錄即可。 – derobert 2009-09-13 16:33:31

2

正如我從你的長問題中所瞭解的那樣,你需要知道一個IP將被禁止或不能在最後$ time_for_ban_try嘗試失敗。那麼你可以嘗試以下各項

$ time_for_ban_try = 10; //分鐘,例如

$ SQL =「SELECT IF(COUNT(ID)< 3, '假', '真')AS is_banned FROM LOGIN_FAILS WHERE ipaddress ='1.2.3.4'並添加了BETWEEN(NOW() - INTERVAL $ time_for_ban_try MINUTE)和NOW NOW()「;

如果我錯了,請讓我知道。

1

Memcache非常適合這類事情,並且與數據庫表相比,將爲您的系統帶來更少的開銷(以及更少的代碼)。您可以通過設置IP-> #_ of_failures的key-> value對來計算登錄失敗次數,並將其緩存數秒鐘,以便跟蹤登錄失敗。如果值(失敗次數)太高,則爲該IP緩存一個唯一的「禁用」值,持續5分鐘。

請注意一個事實,即禁止用戶進行登錄失敗是非常煩人,如果你這樣做,你應該設置故障所允許的數量是非常。用戶通常會有一組密碼(按照「重要性」排列),如果他們忘記密碼,他們會嘗試在您的網站上使用它們。

也要注意多人可能會使用相同的IP(如在大學校園或私人網絡上)。

+0

+1最後的評論。 NAT和網絡代理非常普遍。 (例如美國在線是一個大代理) 1個地址並不總是= 1個用戶。 – txyoji 2009-09-13 13:26:39