>  기사  >  php教程  >  CC, DDOS 공격 시 자동으로 상대방 IP를 차단하는 기능

CC, DDOS 공격 시 자동으로 상대방 IP를 차단하는 기능

大家讲道理
大家讲道理원래의
2016-11-09 09:25:071230검색

이 함수는 짧은 시간 동안 각 방문자가 몇 번이나 방문했는지 계산하는 데 사용됩니다. 방문 횟수가 한도를 초과하면 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[&#39;now&#39;]-$arr[$ip][&#39;t&#39;]) <= 1){  //若距離上次訪問的時間沒有超過1s,則只累加次數
            $arr[$ip][&#39;n&#39;]+=1;
            if($arr[$ip][&#39;n&#39;]>=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][&#39;n&#39;]=1;
            $arr[$ip][&#39;t&#39;]=$_ENV[&#39;now&#39;];
            file_put_contents($_f,serialize($arr),LOCK_EX);
            chmod($_f,0777);
            unset($_f,$arr,$ip);
            return FALSE;
        }
    }
    unset($_f,$arr,$ip);
    return FALSE;
}


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.