PHP防CC攻击实现代码是什么,php如何防止cc攻击

频道:PHP教程 日期:

所谓的CC攻击就是对方利用程序或一些代理对您的网站进行不间断的访问,造成您的网站处理不了而处于当机状态

这种时候您的统计系统(可能是量子、百度等)当然也是统计不到的。不过我们可以借助于一些防攻击的软件来实现,不过效果有时并不明显。

下面我提供一段PHP的代码,可以起到一定的防CC效果。

 //CC攻击停止后会尽快解除验证码,回到正常状态
 //防CC配置
$IPmax = 30; //开启验证码条件 值>=php最大进程数,适当设置更大会降低验证码触发条件,但会增大502错误几率(php挂起) 
$IPfor = 60; //周期 这个值基本不用动
$IPban = 60; //扔入黑名单 60秒内访问超过60次即拉黑IP
$banTime = 3600*24; //黑名单时长 扔小黑屋时长,这种代理IP放一天感觉都少了 = =!
$ip = ip();
 
//连接本地的 Redis 服务
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
 
//拦截黑名单
if($redis->exists($ip.'ban')){
  exit('您被关进了小黑屋,么么哒!');
}
 
//扔黑名单检测
if($redis->get($ip.'ok') >= $IPban){
  $redis->setex($ip.'ban', $banTime, '1');
}
 
if($redis->exists($ip.'ok')){
  $redis->incrby($ip.'ok',1); //记录IP 自增1
}else{
  $redis->setex($ip.'ok',$IPfor,1);
}
 
//按需开启防CC 小黑屋IP不会触发该条件,所以当一段时间以后就会解除验证码。除非攻击者换一批代理继续攻击。如此往复
if(count($redis->keys("*ok")) > $IPmax){
  //验证
  if($_COOKIE['key'] == ''){
    if($_GET['cc']){
      $key = md5($ip.$_GET['cc']);
      setcookie("key",$key);
    }
  }
  //拦截代码
  if($_COOKIE['key'] && $_COOKIE['cc'] && $_COOKIE['key'] == md5($ip.$_COOKIE['cc'])){
    //通过
  }else{
    if($_GET['cc']){
      $key = md5($ip.$_GET['cc']);
      setcookie("key",$key);
    }else{
      $cc = rand(1000,9999);
      setcookie("cc",$cc);
      //这里只是简单的构造了一下验证码,有能力可以自己更改的更安全和完美。
      echo '<!DOCTYPE html>
      <html>
      <body>
      <form action="">请输入:'.$cc.' :<input type="text" name="cc" value=""><input type="submit" value="继续访问"></form> 
      <p>访问异常,请输入验证码。</p>
      </body>
      </html>';
    }
    exit();
  }
}
function ip() {
    if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
        $ip = getenv('HTTP_CLIENT_IP');
    } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
        $ip = getenv('REMOTE_ADDR');
    } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    $res =  preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : '';
    return $res;
}

就凭这几行代码,不能解决问题的。顶多对那些在浏览器里面按F5刷页面的操作关用。

所以推荐大家服务器安装防cc攻击的防火墙效果才会比较好。