이 함수는 짧은 시간 동안 각 방문자가 몇 번이나 방문했는지 계산하는 데 사용됩니다. 방문 횟수가 한도를 초과하면 TRUE를 반환합니다. 그런 다음 PHP를 사용하여 Linux의 iptables를 호출하여 차단 작업을 수행할 수 있습니다
이전에 여러 DDOS 도구를 실제로 테스트했는데 결과가 매우 좋습니다.
그런데 코드에 있는 파일을 사용하여 방문자 IP와 시간을 기록하지 않는 것이 가장 좋습니다. 데이터베이스를 사용하거나 세션에 저장하는 것이 가장 좋습니다. 또한 이 파일을 SSD 하드 드라이브에 저장하는 것이 가장 좋습니다.
/** 防止客戶端惡意重整 用法: $isf5=Fun::isf5(); 返回: 返回bool[true:對方在惡意重整;false:正常訪問] /**/ public static function isf5(){ $_f=Run.'_isf5'; if(!file_exists($_f)){ file_put_contents($_f,serialize(array()),LOCK_EX); chmod($_f,0777); } $arr=unserialize(file_get_contents($_f)); $arr=(!is_array($arr)) ? array() : $arr; //清理掉10秒前訪問的用戶 foreach($arr as $k=>$v){ if($_ENV['now']-$v['t'] >= 10){ unset($arr[$k]); } } $ip='_'.(self::cur('ip')); if(!isset($arr[$ip])){ $arr[$ip]['n']=1; //1s內連線的次數 $arr[$ip]['t']=$_ENV['now']; //第1次訪問的時間 file_put_contents($_f,serialize($arr),LOCK_EX); chmod($_f,0777); unset($_f,$arr,$ip); return FALSE; }else{ if(!isset($arr[$ip]['t']) or !is_numeric($arr[$ip]['t'])){ unset($arr[$ip]); file_put_contents($_f,serialize($arr),LOCK_EX); chmod($_f,0777); unset($_f,$arr,$ip); return FALSE; } if(($_ENV['now']-$arr[$ip]['t']) <= 1){ //若距離上次訪問的時間沒有超過1s,則只累加次數 $arr[$ip]['n']+=1; if($arr[$ip]['n']>=5){ unset($_f,$arr,$ip); return TRUE; }else{ file_put_contents($_f,serialize($arr),LOCK_EX); chmod($_f,0777); unset($_f,$arr,$ip); return FALSE; } }else{ //若距離上次訪問的時間已經超過1s,則重新計數 $arr[$ip]['n']=1; $arr[$ip]['t']=$_ENV['now']; file_put_contents($_f,serialize($arr),LOCK_EX); chmod($_f,0777); unset($_f,$arr,$ip); return FALSE; } } unset($_f,$arr,$ip); return FALSE; }