PHP利用Session来达到防CC攻击的目的

2014 年 1 月 16 日3770

所谓的CC攻击就是对方利用程序或一些代理对您的网站进行不间断的模拟大量用户并发持续访问,造成您的网站处理不了而处于宕机状态。这种时候您的统计系统(可能是量子、百度等)当然也是统计不到的。不过我们可以借助于一些防攻击的软件来实现,不过效果有时并不明显。

如何知道是CC攻击呢?如果你是虚拟主机用户,当被CC攻击时,由于大量的并发访问,导致你的主机CPU处于峰值,无法几时处理请求,导致服务器瘫痪,于是出现“service unariable”。如果你是vps用户,当你发现你的网站无法访问,ftp一直出于“正在链接FTP数据套接字”,然后网站打开异常的慢,最后完全打不开,然后你的vps管理平台(比较常用的免费管理面板kloxo)无法打开,不管你如何重启vps,还是无法进行以上的几种操作,或者重启vps后,有短暂的几秒钟可以正常,之后有不行的。那么,出现以上的这些情况,可以判断是CC攻击了,造成这种情况的原因就是你的vps资源耗尽了。

遇到这种情况,你如果不懂ssh,或者连ssh都无法登录的时候,只能求助于服务商,让他们帮你暂时恢复vps,不过这个恢复,不是长久之计,别人可以换个IP来攻击你。那么遇到这种情况,可以试试以下的方法,可以一定程度上起到作用。当然了,别人想搞死你,你又不精于技术的话,那你知道后果了…

下面是从网上找到的一段PHP的代码,经过验证,可以起到一定的防CC效果。

$P_S_T = $t_array[0] + $t_array[1];
$timestamp = time();
session_start();
$ll_nowtime = $timestamp ;
if (session_is_registered('ll_lasttime')){
$ll_lasttime = $_SESSION['ll_lasttime'];
$ll_times = $_SESSION['ll_times'] + 1;
$_SESSION['ll_times'] = $ll_times;
}else{
$ll_lasttime = $ll_nowtime;
$ll_times = 1;
$_SESSION['ll_times'] = $ll_times;
$_SESSION['ll_lasttime'] = $ll_lasttime;
}
if (($ll_nowtime - $ll_lasttime)=5){
header(sprintf("Location: %s",'http://http://www.zjjv.com//'));
exit;
}
}else{
$ll_times = 0;
$_SESSION['ll_lasttime'] = $ll_nowtime;
$_SESSION['ll_times'] = $ll_times;
}

主要功能:在5秒内连续刷新页面10次以上将指向本机http://http://www.zjjv.com//,注意了,这里的5和10还有那个本机地址,你可以根据你自己的需求进行修改,不过一般这个设置也就可以了。

以上代码可以放在每个PHP文件的包含文件中,这样每页均可起到防CC的效果。里面的参数也可以根据您自己的情况进行一些相应的设置。如果是zencart的话,就直接放在根目录下的index.php文件里面就行了,其他的可以参照zencart的方法。

另外一个高级点的方法就是通过一个文件获取攻击者的ip,然后有针对性的进行防止,来自网络,未经测试,代码如下:

php
if (isset($_SERVER)){
$realip = $_SERVER[HTTP_X_FORWARDED_FOR];
}
else
{
$realip = getenv("HTTP_X_FORWARDED_FOR");
}
if($realip<>""){
$remoteip=$_SERVER['REMOTE_ADDR'];
log_ip($remoteip,$realip);
}
function log_ip($remote_ip,$real_ip)
{
$temp_time = date("y-m-d G:i:s");
$temp_result = $temp_time."t".$real_ip."t".$remote_ip."n";
if(!$fhandle=fopen("cc_log.txt","a+")){
print "error";
exit;
}
fwrite($fhandle,$temp_result);
fclose($fhandle);
}
?>

此段代码作用:

将代理访问的真实IP记录到日志中,以便排查分析。
以下是cc_log.txt的内容(此代码生产是因通过CC攻击软件攻击生产的)

Time Real_ip Remote_ip <=此行是我自己添加的
09-09-05 13:50:47 122.144.131.72 60.248.212.230
09-09-05 13:50:47 122.144.131.72 60.248.212.230
09-09-05 13:50:47 122.144.131.72 60.248.212.230
09-09-05 13:50:48 122.144.131.72 60.248.212.230
09-09-05 13:50:48 122.144.131.72 60.248.212.230
09-09-05 13:50:48 122.144.131.72 60.248.212.230
09-09-05 13:50:49 122.144.131.72 60.248.212.230
09-09-05 13:50:49 122.144.131.72 219.146.172.91
09-09-05 13:50:49 122.144.131.72 219.146.172.91
09-09-05 13:50:49 122.144.131.72 219.146.172.91
09-09-05 13:50:49 122.144.131.72 219.146.172.91
09-09-05 13:50:49 122.144.131.72 219.146.172.91
09-09-05 13:50:49 122.144.131.72 60.248.212.230
09-09-05 13:50:49 122.144.131.72 60.248.212.230
09-09-05 13:50:50 122.144.131.72 219.146.172.91
09-09-05 13:50:50 122.144.131.72 219.146.172.91
09-09-05 13:50:50 122.144.131.72 219.146.172.91
09-09-05 13:50:50 122.144.131.72 219.146.172.91
09-09-05 13:50:50 122.144.131.72 219.146.172.91
09-09-05 13:50:51 122.144.131.72 60.248.212.230

在仅仅有4秒的时间内,就从真实IP 122.144.131.72 以代理IP(60.248.212.230,219.146.172.91)来访问我这台服务器,可见这台真实客户端
是有问题的,这时,我们应该用防火墙(iptables)禁止掉这些真实IP,以使他们的请求,在入口就Deny掉。

0 0