PHP防网页快速刷新

文章目录 (?) [+]

            PHP禁止网页快速刷新,限制用户刷新间隔,刷新间隔内刷新输出警告。监控时间段内刷新超过设定次数即视为恶意攻击,网页将重定向到到攻击者IP上,如果持续刷新则改访客恢复访问时间会随之增加。

    禁止快速刷新

    代码

    调试版

    <?php
    /**
     *
     * Ban Fast Refresh
     *
     * @Version   2.2.2
     * @Date      2016-06-04 17:41:13
     * @Author    森林生灵 <admin@lanseyujie.com>
     * @Link      http://www.lanseyujie.com
     * @Copyright Copyright (c) 2014-2016, lanseyujie.com
     * @License   http://opensource.org/licenses/gpl-2.0.php GPL v2 or later
     *
    **/
    	//禁止使用代理IP访问
    	empty($_SERVER['HTTP_VIA']) or exit('Access Denied');
    	
    	//启用SESSION
    	session_start();
    	
    	//设置允许最小刷新时间间隔(s)
    	$min_interval = 6;
    	//设置监控时间段(s)
    	$period = 30;
    	//规定时间段内最大刷新次数(s)
    	$max_refresh = 25;
    	//附加惩罚时间(s)
    	$pause_time = 40;
    	
    	//调试模式(1为开启)
    	$debug = 1;
    	
    	
    	//判断用户是否第一次加载网页
    	if(isset($_SESSION['post_sep'])){
    		
    		//累计加载次数
    		$_SESSION['refresh_times'] += 1;
    			
    		//调试信息
    		if($debug == 1){
    			echo '<font size="10" color="red">您正处于调试模式,请在调试完后及时关闭调试模式!</font><br />';
    			echo '<font size="5" color="blue">本次加载时间(UNIX时间戳):</font>'.time().'<br />';
    			echo '<font size="5" color="blue">上次惩罚触发器0点时间戳:</font>'.$_SESSION['last_time'].'<br />';
    			echo '<font size="5" color="blue">上次警告触发器0点时间戳:</font>'.$_SESSION["post_sep"].'<br />';
    			echo '<font size="5" color="blue">当前监控时段内网页加载次数(阈值:'.$max_refresh.'):</font>'.$_SESSION['refresh_times'].'<br />';
    			echo '<font size="5" color="blue">本次惩罚触发时差(阈值:'.$period.'):</font>'.(time() - $_SESSION['last_time']).'<br />';
    			echo '<font size="5" color="blue">本次警告触发时差(阈值:'.$min_interval.'):</font>'.(time() - $_SESSION["post_sep"]).'<br />';
    			echo '<font size="5" color="blue">附加惩罚时间:</font>'.$pause_time.'<br />';
    		}
    		
    		//判断是否在监控时间段内
    		if(time() - $_SESSION['last_time'] < $period){
    		
    			//在设置的时间段内超过最大刷新次数就跳转至攻击者服务器地址
    			if($_SESSION['refresh_times'] > $max_refresh){
    				
    				/* 附加惩罚时间,如果触发惩罚,会使流量重定向,40s($pause_time)内如再次加载网页会在原
    				恢复访问时间30s($period)基础上再延迟40($pause_time)s,停止加载后开始倒计时恢复访问*/
    				$_SESSION['last_time'] += $pause_time;
    				
    				if($debug == 1){
    					$debug = 2;
    				}
    				else{
    					header(sprintf('Location:%s', 'http://127.0.0.1'));
    					exit('Access Denied');
    				}
    				
    			}
    			else{
    				//判断是否在允许最小刷新时间间隔内刷新
    				if(time() - $_SESSION['post_sep'] < $min_interval){
    					
    					//人机验证后可立即刷新,否则等待30s方可进行刷新(后续版本)
    					$_SESSION['post_sep'] = time();
    					$debug = 3;
    				}
    				else{
    					$_SESSION['post_sep'] = time();
    				}
    			}
    		}
    		else{
    			//查询黑名单判断是否需要置零(后续版本)
    			$_SESSION['post_sep'] = time();
    			$_SESSION['last_time'] = time();
    			$_SESSION['refresh_times'] = 0;
    		}
    	}
    	else{
    		$_SESSION['post_sep'] = time();
    		$_SESSION['last_time'] = time();
    		$_SESSION['refresh_times'] = 1;
    	}
    	
    	//调试信息
    	if($debug > 0){
    		echo '<font size="5" color="blue">下次惩罚触发器0点时间戳:</font>'.$_SESSION['last_time'].'<br />';
    		echo '<font size="5" color="blue">下次警告触发器0点时间戳:</font>'.$_SESSION["post_sep"].'<br />';
    		if($_SESSION['refresh_times'] == 0){
    			echo '<font size="5" color="red">当前监控时段超时失效现已重新置零!</font><br />';
    		}
    		switch($debug){
    			case 2:
    				//延迟5秒跳转以显示调试信息
    				header(sprintf('Refresh:3;url=http://127.0.0.1'));
    				exit('Access Denied');
    			case 3:
    				exit ('<font size="10" color="red">请不要频繁刷新,休息'.$min_interval.'秒再刷新吧!</font>');
    		}
    	}
    ?>

    正式版

    <?php
    /**
     *
     * Ban Fast Refresh
     *
     * @Version   2.2.2r
     * @Date      2016-06-04 17:48:11
     * @Author    森林生灵 <admin@lanseyujie.com>
     * @Link      http://www.lanseyujie.com
     * @Copyright Copyright (c) 2014-2016, lanseyujie.com
     * @License   http://opensource.org/licenses/gpl-2.0.php GPL v2 or later
     *
    **/
    	empty($_SERVER['HTTP_VIA']) or exit('Access Denied');
    	session_start();
    	$min_interval = 6;//设置允许最小刷新时间间隔(s)
    	$period = 30;//设置监控时间段(s)
    	$max_refresh = 25;//规定时间段内最大刷新次数(s)
    	$pause_time = 40;//附加惩罚时间(s)
    	if(isset($_SESSION['post_sep'])){
    		$_SESSION['refresh_times'] += 1;
    		if(time() - $_SESSION['last_time'] < $period){
    			if($_SESSION['refresh_times'] > $max_refresh){
    				$_SESSION['last_time'] += $pause_time;
    				header(sprintf('Location:%s', 'http://127.0.0.1'));
    				exit('Access Denied');
    			}
    			else{
    				if(time() - $_SESSION['post_sep'] < $min_interval){
    					$_SESSION['post_sep'] = time();
    					exit ('<font size="10" color="red">请不要频繁刷新,休息'.$min_interval.'秒再刷新吧!</font>');
    				}
    				else{
    					$_SESSION['post_sep'] = time();
    				}
    			}
    		}
    		else{
    			$_SESSION['post_sep'] = time();
    			$_SESSION['last_time'] = time();
    			$_SESSION['refresh_times'] = 0;
    		}
    	}
    	else{
    		$_SESSION['post_sep'] = time();
    		$_SESSION['last_time'] = time();
    		$_SESSION['refresh_times'] = 1;
    	}
    ?>
    本文标题:PHP防网页快速刷新
    本文链接:https://lanseyujie.com/post/php-ban-rapid-refresh.html
    版权声明:本文使用「署名 4.0 国际」创作共享协议,转载或使用请遵守署名协议。
    点赞 0 分享 0
    呃...本文暂时没人留言,来添加一个吧!