首页 > php开发 > PHP防CC攻击实现代码总结

PHP防CC攻击实现代码总结

CC攻击就是对方利用程序或一些代理对您的网站进行不间断的访问,造成您的网站处理不了而处于当机状态,下面我们来总结一些防CC攻击的php实例代码,各位朋友可参考.

例1,代码如下:

<?php
//代理IP直接退出
emptyempty($_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');
    }
} else {
    $_SESSION['refresh_times'] = 0;
    $_SESSION['last_time'] = $cur_time;
}
?>

例二,代码如下:

<?php
$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 (!emptyempty($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 (emptyempty($_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'];
}
?>

这样就可以基础工业防止了,但是如果更高级占的就没办法,大家可尝试使用相关硬件防火强来设置.                                        


本文地址:http://www.phprm.com/develop/fs4625.html

转载随意,但请附上文章地址:-)

标签:php防cc攻击 php防止快速刷新

相关文章

发表留言