我想問下面寫的代碼是否有漏洞(可能對其他人有用)。此代碼檢查是否在最近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是從壞符號中清除。
我看不錯。 $ userid以任何方式驗證btw?如果不是,您可能會遇到使用此代碼的SQL注入攻擊。 –
可能受SQL注入影響,具體取決於您從何處獲得$ userid。 –
是的,謝謝你的提問。是的,它從易受攻擊的符號清除,只允許(A..z0..9)。 – Haradzieniec