• 技术文章 >php教程 >php手册

    PHP防CC攻击实现代码总结

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

    例1

    代码如下 复制代码

    //代理IP直接退出
    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');
    }
    }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文件中。

    代码如下 复制代码

    /*
    * 防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 "";
    //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($cc_log)) cc_log(get_ip(), $real_ip, $cc_log, $cc_uri); //产生log
    echo "Wait please, try again later!";
    //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($_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'];
    }
    ?>

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

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:Apache Reference Manual (8) 下一篇:Apache Reference Manual (5)
    Web大前端开发直播班

    相关文章推荐

    • 回帖脱衣服的图片实现 by php...• 在WAS CE上运行PHP• php Memcached分布式缓存(1/3)• php中include require utf-8文件时顶部产生空行的• 基于php-fpm 参数的深入理解

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网