- /**
- * 检查IP是否在CIDR范围内
- * @param string $ip 要检查的IP地址
- * @param string $cidr CIDR格式,如"101.226.103.0/25"
- * @return bool
- */
- function ipInCIDR($ip, $cidr) {
- list($subnet, $bits) = explode('/', $cidr);
-
- // 将IP地址转换为32位整数
- $ip = ip2long($ip);
- $subnet = ip2long($subnet);
- $mask = -1 << (32 - $bits);
-
- return ($ip & $mask) == ($subnet & $mask);
- }
- /**
- * 验证IP地址格式
- * @param string $ip IP地址
- * @return bool
- */
- function isValidIP($ip) {
- return filter_var($ip, FILTER_VALIDATE_IP) !== false;
- }
- /**
- * 完整的IP匹配流程
- * @param string $cidr CIDR格式
- * @return bool
- */
- function checkClientIPInCIDR($cidr) {
- // 获取客户端IP
- $client_ip = getClientIP();
-
- // 验证IP格式
- if (!isValidIP($client_ip)) {
- return false;
- }
-
- // 检查IP是否在CIDR范围内
- return ipInCIDR($client_ip, $cidr);
- }
复制代码
- // 使用示例
- $cidr_range = "101.226.103.0/25";
- $client_ip = getClientIP();
- echo "客户端IP: " . $client_ip . "\n";
- echo "CIDR范围: " . $cidr_range . "\n";
- if (checkClientIPInCIDR($cidr_range)) {
- echo "IP地址在指定范围内\n";
- } else {
- echo "IP地址不在指定范围内\n";
- }
- // 测试特定IP
- $test_ip = "101.226.103.50";
- if (ipInCIDR($test_ip, $cidr_range)) {
- echo "测试IP {$test_ip} 在范围内\n";
- } else {
- echo "测试IP {$test_ip} 不在范围内\n";
- }
复制代码 |