如果客户端在 PHP 中具有 ipv6,如何使用 ipv4 阻止 ip [重复]

问题描述 投票:0回答:1

我正在使用 PHP 构建一个网站,我想将其配置为仅检查客户端的 IPv4,但我遇到一个问题,如果客户端有 IPv6,它就会获取 IPv6。

我使用 $_SERVER['HTTP_X_FORWARDED_FOR'] 获取 IP,但只获取 1 个 IP,并优先获取 IPv6。我只想通过监听 0.0.0.0:80 在 Apache 中接收 IPv4,但它不起作用。请给我一个解决方案

php laravel codeigniter-3 laragon
1个回答
-1
投票

为了确保在 PHP 中仅获取客户端的 IPv4 地址,您可以结合使用 $_SERVER 超全局变量和检查有效的 IPv4 地址。

function getClientIPv4() {
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ipList = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
    foreach ($ipList as $ip) {
        $ip = trim($ip);
        if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
            return $ip;
        }
    }
}

// Fallback to the remote address if no forwarded IP is valid
if (!empty($_SERVER['REMOTE_ADDR']) && filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
    return $_SERVER['REMOTE_ADDR'];
}

return null;
}

// Usage
$clientIPv4 = getClientIPv4();
if ($clientIPv4) {
    echo "Client's IPv4: " . $clientIPv4;
} else {
    echo "No valid IPv4 found.";
}

此函数将检查 HTTP_X_FORWARDED_FOR 和 REMOTE_ADDR 字段中的 IPv4 地址,确保您只获得有效的 IPv4 地址。如果没有找到有效的 IPv4,将返回 null。

© www.soinside.com 2019 - 2024. All rights reserved.