crx349 发表于 6 天前

PHP获取客户端ip后进行ipv4地址段匹配函数


/**
* 检查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";
}
页: [1]
查看完整版本: PHP获取客户端ip后进行ipv4地址段匹配函数