PHP限制ip以及IP段是否允许访问,以及对ip子网的理解
php 如何限制ip访问:
// 判断ip是否被允许
function isIpBlocked($clientIP,$blockedIPs) {
foreach ($blockedIPs as $blocked) {
// 检查是否为CIDR表示法
if (strpos($blocked, '/') !== false) {
list($subnet, $mask) = explode('/', $blocked);
$mask = intval($mask);
$subnet = ip2long($subnet);
$clientIPLong = ip2long($clientIP);
$wildcard = pow(2, (32 - $mask)) - 1;
$netID = $subnet & ~$wildcard;
if (($clientIPLong & ~$wildcard) == $netID) {
return true; // 客户端IP在被禁止的子网段内
}
} else { // 如果是单个IP地址
if ($blocked == $clientIP) {
return true; // 客户端IP匹配被禁止的地址
}
}
}
return false; // 客户端IP不在被禁止的范围内
}
// 示例:不允许特定IP和一个子网段访问
$blockedIPs = array(
'193.11.21.234', // 禁止这个特定IP
'193.11.0.0/24', // 或者这个子网段的任何IP
'193.168.0.0/16' // 或者这个子网段的任何IP
);
$clientIP = $_SERVER['REMOTE_ADDR'];
if (isIpBlocked($clientIP,$blockedIPs)) {
die("禁止");
}
// 如果通过了检查
echo "Welcome!";这里对ip中的类似193.11.0.0/24类似这样的IP段进行理解一下:
IP地址一共是32位,由4个是8位组成 ,分成A,B,C,3类地址。
这里的193.11.0.0/24 表示前面24位是一样的,就是193.11.0是一样的,而最后一位的0就是可变,从0~255,所以如果禁止193.11.0.0/24表示:禁止193.11.0.0~193.11.0.255这个IP段
同样的如果是193.11.0.0/16,说明是个B类地址,前16位是一样的,说明193.11后面的被禁止了,192.0.0.0/8也是类似的效果。
1、代码中$clientIP = '193.11.0.12',符合了193.168.0.0/24所以也是被禁止,但是193.11.1.0就不符合了,是被允许的。
2、代码中$clientIP = '193.168.1.12',符合了193.168.0.0/16所以也是被禁止
