Products
GG网络技术分享 2025-03-18 16:17 0
在PHP中实现IP限流和允许特定IP访问的功能,可以通过编写一个简单的访问控制类或函数来完成。以下是一个基本的代码示例,展示了如何实现这两个功能:
<?php
// 定义一个简单的访问控制类
class AccessControl {
private $allowedIPs = [\'127.0.0.1\', \'192.168.1.1\']; // 允许访问的IP列表
private $limit = 10; // 每个IP允许的最大访问次数
private $timeFrame = 60; // 时间窗口(秒)
public function isAllowed($ip) {
$accessLog = $this->getAccessLog();
$accessCount = isset($accessLog[$ip]) ? $accessLog[$ip] : 0;
$currentTime = time();
// 检查IP是否在允许列表中
if (!in_array($ip, $this->allowedIPs)) {
return false;
}
// 检查访问次数是否超过限制
if ($accessCount >= $this->limit) {
return false;
}
// 检查当前时间是否超出时间窗口
foreach ($accessLog as $logIp => $logTime) {
if ($logTime > ($currentTime - $this->timeFrame)) {
continue;
}
unset($accessLog[$logIp]);
}
// 记录访问
$accessLog[$ip] = $currentTime;
$this->setAccessLog($accessLog);
return true;
}
private function getAccessLog() {
// 从文件或数据库中获取访问日志
// 这里我们使用一个简单的数组来模拟
return $_SESSION[\'accessLog\'] ?? [];
}
private function setAccessLog($log) {
// 将访问日志保存到文件或数据库
// 这里我们将日志保存到SESSION中
$_SESSION[\'accessLog\'] = $log;
}
}
// 使用示例
$accessControl = new AccessControl();
// 检查当前IP是否允许访问
if ($accessControl->isAllowed($_SERVER[\'REMOTE_ADDR\'])) {
// 允许访问
// ... 正常处理请求
} else {
// 拒绝访问
header(\'HTTP/1.1 429 Too Many Requests\');
echo \'Too Many Requests\';
exit;
}
?>这个示例中的AccessControl类提供了IP限流和白名单的功能。它首先定义了一个允许访问的IP列表和一个每个IP允许的最大访问次数。然后,它通过一个时间窗口来跟踪每个IP的访问次数。
isAllowed方法检查请求的IP是否在白名单中、访问次数是否超过限制,以及当前请求是否超出了时间窗口。如果所有检查都通过,它会增加IP的访问计数并允许访问。否则,它会拒绝访问并返回429 HTTP状态码。
请注意,这个示例使用$_SESSION来存储访问日志,这在实际生产环境中可能不是最佳选择,因为它依赖于会话。在实际应用中,你可能需要将访问日志存储在数据库或使用缓存系统(如Redis)来提高性能和可扩展性。
此外,限流策略可能会对用户体验产生影响,因此在实施之前应仔细考虑其对业务的影响,并根据实际情况调整限流参数。
Demand feedback