CC攻击简介
CC = Challenge Collapsar,意为“挑战黑洞”,其前身名为Fatboy攻击,是利用不断对网站发送连接请求致使形成拒绝服务的目的。攻击针对论坛等需要查询大量数据库的程序特别有效。
开始解决
其实先百度的,百度PHP防止CC攻击,有参考代码,看了几个,其实没有屁用。因为他们用的SESSION来记录,可是SESSION和客户端COOKIE有关,我攻击的时候还提交COOKIE干嘛?用户难道手动点击去攻击你?显然用这种方式识别客户端不太合适,没办法,只能自己写段代码解决了。
解决办法
直接上代码。这里使用了SAE的Memcache服务来记录数据。
/*fuck cc*/
$mmc = new \Memcache;
$ret = $mmc->connect();
if ($ret ) {
$ip = $_SERVER["REMOTE_ADDR"];//获取请求IP
$data = $mmc->get($ip);
if($data){
if(!$data['access']){//判断访问权限
// echo "WTF!?";
exit();//直接断开连接
}
$data['count'] += 1;
//下面判断,1s内访问50次的客户端判断为攻击者
if($data['count']>50 && ((time()-$data['time'])<2)){
$data['access'] = false;
$mmc->set($ip,$data,0,3600);//禁止访问3600s也就是1h
}
$mmc->set($ip,$data,0,60);
}else{//记录该IP第一次访问的时间
$data['count'] = 1;
$data['time'] = time();
$data['access'] = true;
$mmc->set($ip,$data,0,60);
}
}
/*end fuck cc*/
我这里实现是根据客户端的IP来识别。
优点是能有效防止单个IP的CC攻击。
缺点是针对大量内网机器使用同一个公网IP的情况会造成误判,不过可以通过适当的调整判断攻击的门限值来避免这种情况。(调整代码中次数阈值和时间差阈值)
再者说对于我的小博客来说已经满足我的使用场景了,不需要考虑共用公网IP的情况了。
本博客亲测有效!只能防CC,流量攻击当然没用!