✨ 封禁 IP 功能支持通配符
This commit is contained in:
@@ -24,11 +24,47 @@ class Initialize
|
||||
$banIp = $this->getConfig('ban_ip');
|
||||
if ($banIp) {
|
||||
$ips = explode(',', str_replace(',', ',', $banIp));
|
||||
if (in_array($request->ip(), $ips)) {
|
||||
if ($this->banIp($request->ip(), $ips)) {
|
||||
throw new HttpResponseException(Response::code(403));
|
||||
}
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
/**
|
||||
* 拦截某个IP, 支持通配符
|
||||
*
|
||||
* @param string $ip
|
||||
* @param array $ips
|
||||
* @return bool
|
||||
*/
|
||||
private function banIp(string $ip, array $ips)
|
||||
{
|
||||
$parts = explode('.', $ip); // 分段当前 IP
|
||||
$ban = false;
|
||||
foreach ($ips as $item) {
|
||||
// 如果直接匹配到
|
||||
if ($item === $ip) {
|
||||
$ban = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strpos($item, '*') !== false) {
|
||||
$array = explode('.', $item);
|
||||
$check = true;
|
||||
for ($i = 0; $i < count($array); $i++) {
|
||||
if ($array[$i] !== '*' && $array[$i] !== $parts[$i]) {
|
||||
$check = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ($check) {
|
||||
$ban = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $ban;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user