2011-12-05 24 views
1

我想問下面寫的代碼是否有漏洞(可能對其他人有用)。此代碼檢查是否在最近5分鐘內進行了超過5次嘗試登錄。通過ip和userid進行檢查。每次嘗試登錄都存儲在歷史記錄表(MySQL)中。這個php代碼中的任何漏洞/可能的優化,以檢測是否需要驗證碼?

歷史表僅用於CAPTCHA顯示的目的。 ENGINE = InnoDB被選中。 (你是否推薦使用MyISAM來獲得更好的性能?你會推薦使用Time還是userid或remote_addr?)

有關優化的任何建議?可能的洞? 謝謝。

$query1="SELECT id FROM history WHERE (Time>date_sub(now(), interval 5 minute)) AND remote_addr='".ip2long($_SERVER['REMOTE_ADDR'])."' limit 6"; //limit 6 is for performance, 6+ means 6, we only care if it less than 5 
$result1=mysql_query($query1); 
//so we know mysql_num_rows($result1) 


$query2="SELECT id FROM history WHERE (Time>date_sub(now(), interval 5 minute)) AND userid='".$userid."' limit 6";//limit 6 is for performance, 6+ means 6, we only care if it less than 5 
$result2=mysql_query($query2); 
//so we know mysql_num_rows($result2) 



$attempts=0;//we want to set up $attempts=maximum of (mysql_num_rows($result1), mysql_num_rows($result2)) 
if($result1) { 
    $attempts=mysql_num_rows($result1); 
} 
if($result2 && $attempts<mysql_num_rows($result2)) { 
    $attempts=mysql_num_rows($result2); 
} 

//if $attempts is more than 5, then CAPTCHA should be displayed, if less then it should not 

P.S.如果有人在有一天寫了algorythm(直到驗證碼再次變得更強)來破解驗證碼,你是否仍然建議使用睡眠(100000)或其他方法來防止暴力?

添加:感謝您詢問,是的,$ userid是從壞符號中清除。

+0

我看不錯。 $ userid以任何方式驗證btw?如果不是,您可能會遇到使用此代碼的SQL注入攻擊。 –

+0

可能受SQL注入影響,具體取決於您從何處獲得$ userid。 –

+0

是的,謝謝你的提問。是的,它從易受攻擊的符號清除,只允許(A..z0..9)。 – Haradzieniec

回答

3

如果對$ userid進行了清理,沒有任何安全問題,但我會提供以下更改以使代碼更有效:使用MySQL的COUNT函數而不是返回六個ID號。如果您不需要使用這些ID,請不要檢索它們。此外,我沒有理由查詢數據庫兩次。稍微留意一下。

下面的代碼更短,更快,更安全(與mysql_real_escape_string() - 我建議看看這個功能)。我們消除查詢時,一對夫婦的if報表,節省通過網絡發送不必要的數據:

$userid = mysql_real_escape_string('...'); 
$ip = ip2long($_SERVER['REMOTE_ADDR']); 

$q = "SELECT COUNT(*) AS cnt FROM history 
    WHERE Time > date_sub(now(), interval 5 minute) 
    AND (remote_addr='$ip' OR userid='$userid') 
"; 
$r = mysql_query($q); 

// first value, first row (we only get one using count) 
$attempts = mysql_result($r, 0, "cnt"); 

// if $attempts is more than 5, then CAPTCHA should be displayed ... 
+0

非常感謝您的幫助。雖然我必須注意到結果略有不同(它計算總3 + 4 = 7而不是最大(3,4)= 4,但這是一個巨大的改進)。非常感謝! – Haradzieniec