封禁 IP 功能支持通配符

This commit is contained in:
WispX
2020-03-18 21:18:36 +08:00
parent 32aac46ff0
commit 8d735df6a8
+37 -1
View File
@@ -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;
}
}