IP地址限流通常用于服务器被同一IP地址来路,通过高频访问网站或应用端服务器暴力攻击的一种技术。该方法是通过php代码实现阻止来路端同一ip地址高频访问网站或者是应用在指定时间内的访问次数上线,最终达到预防流量崩塌,预防服务不可用的一种技术。
以下是一个使用PHP实现基于IP地址限流的简单示例代码:
<?php
class RateLimiter
{
private $redis;
private $limit;
private $timeWindow;
public function __construct($redis, $limit = 10, $timeWindow = 60)
{
$this->redis = $redis;
$this->limit = $limit;
$this->timeWindow = $timeWindow;
}
public function allow($ip)
{
$key = "rate_limit:$ip";
$count = $this->redis->incr($key);
if ($count == 1) {
// 设置过期时间
$this->redis->expire($key, $this->timeWindow);
}
return $count <= $this->limit;
}
}
// 示例用法
$redis = new Redis();
$redis->connect('12.34.56.78', 6379); // 根据实际Redis服务器地址端口修改
$limiter = new RateLimiter($redis);
$clientIp = $_SERVER['REMOTE_ADDR'];
if ($limiter->allow($clientIp)) {
// 执行允许的操作
echo "Allowed to access.";
} else {
echo "Rate limit exceeded.";
}
在上述代码中:
1. RateLimiter类:
构造函数接收一个“Redis”连接对象,以及可选的限流数量(默认为10次)和时间窗口(默认为60秒)。
“allow”方法用于检查给定IP地址是否在允许的访问次数之内。它使用Redis的“incr”操作对特定IP对应的键进行自增计数。如果计数为1,说明是首次访问,设置此键的过期时间。然后判断计数是否小于等于设置的限制。
2. 示例用法部分:
首先建立与Redis服务器的连接。
然后创建“RateLimiter”实例。
获取客户端的IP地址后,使用“allow”方法判断是否允许访问。
请注意:
上述代码假设已经安装了Redis扩展,并且有正在运行的Redis服务器可供连接。如果要使用其他存储方式(如数据库)来实现,需要修改对应的代码逻辑。
你可以根据实际需求调整限流的数量、时间窗口等参数。用户若有更高的定制化需求,例如根据不同的接口或者业务逻辑设置不同的限流规则,可以按照以下思路进一步修改:
需要确定不同业务逻辑对应的区分标识(如接口路径、用户类型等)。
在“RateLimiter”类中可能需要增加更多的参数或者方法来适应多种业务的限流需求。