Press "Enter" to skip to content

PHP防止恶意刷新页面

Last updated on 2020年11月24日

如果有人利用压力测试你的网站,每小时,40W数据提交,是不是感觉有点浪费?

使用session来简单处理下就ok👌,可以防止同一个IP提交恶意数据测试,也可以进行访问频率限制。

/*防止同一ip刷新*/
//$allowTime防刷新时间单位s,建议做成配置项
function refuseRefresh($allowTime=10){
    session_start();
    $ip4=$_SERVER['REMOTE_ADDR'];
    $allowT = md5($ip4);
    if(!isset($_SESSION[$allowT])){
        $_SESSION[$allowT] = time();
        return false;
    }elseif(time() - $_SESSION[$allowT] > $allowTime){
        $_SESSION[$allowT] = time();
        return false;
    }else{
        return true;
    }
}

简单有效的防止同一个IP刷新的方法,记录📝下。


20201124 更新下使用 redis 限制访问频率方法:

//获取客户端真实ip地址  
function get_client_ip(){
    static $realip;
    if(isset($_SERVER)){
        if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
            $realip=$_SERVER['HTTP_X_FORWARDED_FOR'];
        }else if(isset($_SERVER['HTTP_CLIENT_IP'])){
            $realip=$_SERVER['HTTP_CLIENT_IP'];
        }else{
            $realip=$_SERVER['REMOTE_ADDR'];
        }
    }else{
        if(getenv('HTTP_X_FORWARDED_FOR')){
            $realip=getenv('HTTP_X_FORWARDED_FOR');
        }else if(getenv('HTTP_CLIENT_IP')){
            $realip=getenv('HTTP_CLIENT_IP');
        }else{
            $realip=getenv('REMOTE_ADDR');
        }
    }
    return $realip;
}

// 限制IP频率
$redis = new Redis();    
$redis->connect('127.0.0.1', 6379);  
$key = 'prefix_' . get_client_ip();
// 限制次数为5次
$limit = 5;
$check = $redis->exists($key);
if($check){
    $redis->incr($key);
    $count = $redis->get($key);
    if($count > $limit){
        die('已经超出了限制次数');
    }
}else{  
    $redis->incr($key);
    // 过期时间
    $redis->expire($key, 60);
}
$count = $redis->get($key);
echo '第 '.$count.' 次请求';

2 Comments

  1. coco
    coco 2019年9月2日

    这样要是大流量网站,session不很浪费空间吗?

    • thinkwei
      thinkwei 2019年9月6日

      也可以使用cookie来把信息保存到客户端

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code