如果有人利用压力测试你的网站,每小时,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.' 次请求';
这样要是大流量网站,session不很浪费空间吗?
也可以使用cookie来把信息保存到客户端