检查 IP 是否存在于多个 CIDR 范围内
Check if an IP exists in multiple CIDR ranges
我正在构建一个基本的 WAF,并且我可以访问多个 CIDR 范围的不良访问者。
我的实现是这样的:
$badIPRanges = [
'1.2.220.142/31',
'1.2.220.144/29',
'1.2.220.152/30',
];
function isBlackListed(string $ip, array $ipRanges): bool {
foreach ($ipRanges as $ipRange) {
if (ipInRange($ip, $ipRange)) {
return true;
}
}
return false;
}
function ipInRange(string $ip, string $ipRange): bool {
[$net, $mask] = explode('/', $ipRange);
$ip_net = ip2long($net);
$ip_mask = ~((1 << (32 - $mask)) - 1);
$ip_ip = ip2long($ip);
$ip_ip_net = $ip_ip & $ip_mask;
return ($ip_ip_net == $ip_net);
}
var_dump(isBlackListed('1.2.220.145', $badIPRanges) ? 'Yes' : 'No');
我预计 1.2.220.145
不会在多个 CIDR 范围内,但显然不是。我从上面的测试代码中得到 Yes
。
我是不是做错了什么?或者这是有效的吗?原始实现取自 here.
使用 https://tehnoblog.org/ip-tools/ip-address-in-cidr-range/ 我验证了 1.2.220.145
在 1.2.220.144/29
CIDR 块中,这是否意味着 CIDR 块 1.2.220.142/31
在我的 [=16= 中是多余的] 列表?
除非您已经深入理解了这种格式,否则您很少会看到点分四边形表示法,也不知道除了 8 的倍数之外的任何子网划分是什么。
这些网络的二进制表示是:
1.2.220.142 31 00000001 00000010 11011100 10001110
1.2.220.144 29 00000001 00000010 11011100 10010000
1.2.220.152 30 00000001 00000010 11011100 10011000
1.2.220.142/31
与其他两个完全不同,none 重叠。
我正在构建一个基本的 WAF,并且我可以访问多个 CIDR 范围的不良访问者。
我的实现是这样的:
$badIPRanges = [
'1.2.220.142/31',
'1.2.220.144/29',
'1.2.220.152/30',
];
function isBlackListed(string $ip, array $ipRanges): bool {
foreach ($ipRanges as $ipRange) {
if (ipInRange($ip, $ipRange)) {
return true;
}
}
return false;
}
function ipInRange(string $ip, string $ipRange): bool {
[$net, $mask] = explode('/', $ipRange);
$ip_net = ip2long($net);
$ip_mask = ~((1 << (32 - $mask)) - 1);
$ip_ip = ip2long($ip);
$ip_ip_net = $ip_ip & $ip_mask;
return ($ip_ip_net == $ip_net);
}
var_dump(isBlackListed('1.2.220.145', $badIPRanges) ? 'Yes' : 'No');
我预计 1.2.220.145
不会在多个 CIDR 范围内,但显然不是。我从上面的测试代码中得到 Yes
。
我是不是做错了什么?或者这是有效的吗?原始实现取自 here.
使用 https://tehnoblog.org/ip-tools/ip-address-in-cidr-range/ 我验证了 1.2.220.145
在 1.2.220.144/29
CIDR 块中,这是否意味着 CIDR 块 1.2.220.142/31
在我的 [=16= 中是多余的] 列表?
除非您已经深入理解了这种格式,否则您很少会看到点分四边形表示法,也不知道除了 8 的倍数之外的任何子网划分是什么。
这些网络的二进制表示是:
1.2.220.142 31 00000001 00000010 11011100 10001110
1.2.220.144 29 00000001 00000010 11011100 10010000
1.2.220.152 30 00000001 00000010 11011100 10011000
1.2.220.142/31
与其他两个完全不同,none 重叠。