linhuiming
因上努力,果上随缘

网站防止CC攻击恶意重复刷新的解决办法

  • LinHuiMing

方法1

恶意刷新就是非正常访问网页,比如用软件等,不停的去刷新或提交某一页面,导致大量无效数据或者通过大量刷新页面的请求占用大量网络资源,以达到瘫痪网络的目的。

为了防止页面被恶意刷新,特写了一个防止恶意刷新页面的程序,两次访问时间隔小于0.5秒,即提示用户不要恶意刷新网页。代码如下:

<?php
session_start();
$allow_sep = "0.5";//防刷新间隔秒数
$okvist=false;
// 获取当前时间戳,精确到毫秒
function microtime_float(){
   list($usec, $sec) = explode(" ", microtime());
   return ((float)$usec + (float)$sec);
}
//防刷
if(isset($_SESSION["post_sep"])){
        $septime=microtime_float() - $_SESSION["post_sep"];
        if($septime < $allow_sep){
                exit("请不要恶意刷新页面");
        }else{
                $_SESSION["post_sep"] = microtime_float();
                $okvist=true;
        }
}else{
        $_SESSION["post_sep"] = microtime_float();
        $okvist=true;
}
//正常访问...
?>

把上面代码直接放到模板中即可

方法2.1

1、创建一个cc.html文件复制以下代码放进去:

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>防CC刷新攻击中,5秒后跳转首页</title>
<meta http-equiv="refresh" content="5;url=/" />
<style>*{box-sizing:inherit;}body{min-height:100vh;display:flex;justify-content:center;align-items:center;background:#151924;padding:0;margin:0;}.loading{--color:#F5F9FF;--duration:2000ms;font-family:Roboto,Arial;font-size:24px;position:relative;white-space:nowrap;user-select:none;color:var(--color);}.loading span{--x:0;--y:0;--move-y:0;--move-y-s:0;--delay:0ms;display:block;position:absolute;top:0;left:0;width:1px;text-indent:calc(var(--x) * -1);overflow:hidden;transform:translate(var(--x),var(--y));}.loading.start div{opacity:0;}.loading.start span{animation:move var(--duration) ease-in-out var(--delay);}@keyframes move{30%{transform:translate(var(--x),var(--move-y));}82%{transform:translate(var(--x),var(--move-y-s));}</style>
</head>
<body>
<div class="loading">防CC刷新攻击中,5秒后跳转首页</div><br>
    <script src="https://cdn.bootcss.com/jquery/3.3.0/jquery.min.js"></script>
    <script type="text/javascript">
$(document).ready(function(){let loading=$('.loading').wrapInner('<div></div>'),min=20,max=70,minMove=10,maxMove=20;startAnimation(loading);loading.on('animationend webkitAnimationEnd oAnimationEnd','span:last-child',e=>{startAnimation(loading)});function setCSSVars(elem,min,max,minMove,maxMove){let width=Math.ceil(elem.width()),text=elem.text();for(let i=1;i<width;i++){let num=Math.floor(Math.random()*(max-min+1))+min,numMove=Math.floor(Math.random()*(maxMove-minMove+1))+minMove,dir=(i%2==0)?1:-1,spanCurrent=elem.find('span:eq('+i+')'),span=spanCurrent.length?spanCurrent:$('<span />');span.css({'--x':i-1+'px','--move-y':num*dir+'px','--move-y-s':((i%2==0)?num*dir-numMove:num*dir+numMove)+'px','--delay':i*10+'ms'});if(!spanCurrent.length){elem.append(span.text(text))}}}function startAnimation(elem){elem.removeClass('start');setCSSVars(elem,min,max,minMove,maxMove);void elem[0].offsetWidth;elem.addClass('start')}});
</script>
</body>
</html>

2、将下面代码插入在模板中内

<?php
function aeink_cc(){
    //代理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', 'cc.html'));
            exit('Access Denied');
        }
    }else{
        $_SESSION['refresh_times'] = 0;
        $_SESSION['last_time'] = $cur_time;
    }
}
?>

3、在模板中<html>前插入<?php echo aeink_cc(); ?>

方法2.1

<?php
function maple_cc(){
       session_start();
$timestampcc = time();
$cc_nowtime = $timestampcc;
if(isset($_SESSION['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;} 
if(($cc_nowtime-$cc_lasttime)<60){if($cc_times>=3){header(sprintf('Location:%s', 'http://127.0.0.1'));exit;}//60秒内刷新3次以上可能为cc攻击
}else{$cc_times = 0;$_SESSION['cc_lasttime'] = $cc_nowtime;$_SESSION['cc_times'] = $cc_times;}
}
echo maple_cc();
?>

把:http://127.0.0.1 换为方法2.1中的cc.html

  • YES
  • NO
更多>>

相关文章