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所以也是被禁止