PHP防CC攻击实现代码总结
CC攻击就是对方利用程序或一些代理对您的网站进行不间断的访问,造成您的网站处理不了而处于当机状态,下面我们来总结一些防CC攻击的php实例代码,各位朋友可参考.
例1,代码如下:
//代理IP直接退出
empty empty ( $_SERVER [ 'HTTP_VIA' ]) or exit ( 'Access Denied' );
//防止快速刷新
session_start();
$seconds = '3' ; //时间段[秒]
$refresh = '5' ; //刷新次数
//设置监控变量
$cur_time = time();
if (isset( $_SESSION [ 'last_time' ])){
$_SESSION [ 'refresh_times' ] += 1;
} else {
$_SESSION [ 'refresh_times' ] = 1;
$_SESSION [ 'last_time' ] = $cur_time ;
}
//处理监控结果
if ( $cur_time – $_SESSION [ 'last_time' ] < $seconds ){
if ( $_SESSION [ 'refresh_times' ] >= $refresh ){
//跳转至攻击者服务器地址
header(sprintf( 'Location:%s' , 'http://127.0.0.1' ));
exit ( 'Access Denied' );
} //开源代码phpfensi.com
} else {
$_SESSION [ 'refresh_times' ] = 0;
$_SESSION [ 'last_time' ] = $cur_time ;
}例二,代码如下:
$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 )<3){
if ( $ll_times >=5){
header(sprintf( "Location: %s" , 'http://127.0.0.1' ));
exit ;
}
} else {
$ll_times = 0;
$_SESSION [ 'll_lasttime' ] = $ll_nowtime ;
$_SESSION [ 'll_times' ] = $ll_times ;
}一个实例我自己亲测的,日志分析:
[2011-04-16 03:03:13] [client 61.217.192.39] /index.php
[2011-04-16 03:03:13] [client 61.217.192.39] /index.php
[2011-04-16 03:03:13] [client 61.217.192.39] /index.php
[2011-04-16 03:03:13] [client 61.217.192.39] /index.php
[2011-04-16 03:03:12] [client 61.217.192.39] /index.php
[2011-04-16 03:03:12] [client 61.217.192.39] /index.php
[2011-04-16 03:03:12] [client 61.217.192.39] /index.php
[2011-04-16 03:03:11] [client 61.217.192.39] /index.php
[2011-04-16 03:03:11] [client 61.217.192.39] /index.php
[2011-04-16 03:03:11] [client 61.217.192.39] /index.php
[2011-04-16 03:03:10] [client 61.217.192.39] /index.php
[2011-04-16 03:03:10] [client 61.217.192.39] /index.php下面是PHP方法,将以下代码另存为php文件,然后首行include入你的common.php文件中,代码如下:
<?php
/*
* 防CC攻击,不死版.
*
* 如果每秒内网站刷新次数超过2次,延迟5秒后访问。
*/
$cc_min_nums = '1' ; //次,刷新次数
$cc_url_time = '5' ; //秒,延迟时间
//$cc_log = 'cc_log.txt'; //启用本行为记录日志
$cc_forward = 'http://localhost' ; //释放到URL
//——————————————–
//返回URL
$cc_uri = $_SERVER [ 'REQUEST_URI' ]? $_SERVER [ 'REQUEST_URI' ]:( $_SERVER [ 'PHP_SELF' ]? $_SERVER [ 'PHP_SELF' ]: $_SERVER [ 'SCRIPT_NAME' ]);
$site_url = 'http://' . $_SERVER [ 'HTTP_HOST' ]. $cc_uri ;
//启用session
if ( !isset( $_SESSION ) ) session_start();
$_SESSION [ "visiter" ] = true;
if ( $_SESSION [ "visiter" ] <> true){
echo "<script>setTimeout(" window.location.href = '$cc_forward' ; ", 1);</script>" ;
//header("Location: ".$cc_forward);
exit ;
}
$timestamp = time();
$cc_nowtime = $timestamp ;
if (session_is_registered( 'cc_lasttime' )){
$cc_lasttime = $_SESSION [ 'cc_lasttime' ];
$cc_times = $_SESSION [ 'cc_times' ] + 1;
$_SESSION [ 'cc_times' ] = $cc_times ;
} else {
$cc_lasttime = $cc_nowtime ;
$cc_times = 1;
$_SESSION [ 'cc_times' ] = $cc_times ;
$_SESSION [ 'cc_lasttime' ] = $cc_lasttime ;
}
//获取真实IP
if (isset( $_SERVER )){
$real_ip = $_SERVER [ 'HTTP_X_FORWARDED_FOR' ];
} else {
$real_ip = getenv ( "HTTP_X_FORWARDED_FOR" );
}
//print_r($_SESSION);
//释放IP
if (( $cc_nowtime – $cc_lasttime )<=0){
if ( $cc_times >= $cc_min_nums ){
if (! empty empty ( $cc_log )) cc_log(get_ip(), $real_ip , $cc_log , $cc_uri ); //产生log
echo "Wait please, try again later!<script>setTimeout(" window.location.href = '$site_url' ; ", 5000);</script>" ;
//printf('您的刷新过快,请稍后。');
//header("Location: ".$cc_forward);
exit ;
}
} else {
$cc_times = 0;
$_SESSION [ 'cc_lasttime' ] = $cc_nowtime ;
$_SESSION [ 'cc_times' ] = $cc_times ;
}
//记录cc日志
function cc_log( $client_ip , $real_ip , $cc_log , $cc_uri ){
$temp_time = date ( "Y-m-d H:i:s" , time() + 3600*8);
$temp_result = "[" . $temp_time . "] [client " . $client_ip . "] " ;
if ( $real_ip ) $temp_result .= " [real " . $real_ip . "] " ;
$temp_result .= $cc_uri . "rn" ;
$handle = fopen ( "$cc_log" , "rb" );
$oldcontent = fread ( $handle , filesize ( "$cc_log" ));
fclose( $handle );
$newcontent = $temp_result . $oldcontent ;
$fhandle = fopen ( "$cc_log" , "wb" );
fwrite( $fhandle , $newcontent , strlen ( $newcontent ));
fclose( $fhandle );
}
//获取在线IP
function get_ip() {
global $_C ;
if ( empty empty ( $_C [ 'client_ip' ])) {
if ( getenv ( 'HTTP_CLIENT_IP' ) && strcasecmp ( getenv ( 'HTTP_CLIENT_IP' ), 'unknown' )) {
$client_ip = getenv ( 'HTTP_CLIENT_IP' );
} elseif ( getenv ( 'HTTP_X_FORWARDED_FOR' ) && strcasecmp ( getenv ( 'HTTP_X_FORWARDED_FOR' ), 'unknown' )) {
$client_ip = getenv ( 'HTTP_X_FORWARDED_FOR' );
} elseif ( getenv ( 'REMOTE_ADDR' ) && strcasecmp ( getenv ( 'REMOTE_ADDR' ), 'unknown' )) {
$client_ip = getenv ( 'REMOTE_ADDR' );
} elseif (isset( $_SERVER [ 'REMOTE_ADDR' ]) && $_SERVER [ 'REMOTE_ADDR' ] && strcasecmp ( $_SERVER [ 'REMOTE_ADDR' ], 'unknown' )) {
$client_ip = $_SERVER [ 'REMOTE_ADDR' ];
}
$_C [ 'client_ip' ] = $client_ip ? $client_ip : 'unknown' ;
}
return $_C [ 'client_ip' ];
}
?>这样就可以基础工业防止了,但是如果更高级占的就没办法,大家可尝试使用相关硬件防火强来设置.