«

EMLOG支持接收IPV6地址信息

发布于 阅读:92 教程


mlog应用无法获取到IPv6地址的问题出现在 include/lib/common.php 文件中的 getIp() 函数。

function getIp()
{
    $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';

    // Check for Cloudflare
    if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
        $ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
    } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $list = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $ip = trim($list[0]);
    }

    if (!ip2long($ip)) {  // 这里是问题所在
        $ip = '';
    }

    return $ip;
}

问题根源 :第50行使用了 ip2long($ip) 来验证IP地址的有效性,但是 ip2long() 函数只支持IPv4地址,对于IPv6地址会返回 false ,导致IPv6地址被当作无效地址而被清空。

这个问题影响到多个功能模块:

解决方法
需要修改 getIp() 函数,使其支持IPv6地址验证:

function getIp()
{
    $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';

    // Check for Cloudflare
    if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
        $ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
    } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $list = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $ip = trim($list[0]);
    }

    // 使用 filter_var 替代 ip2long,支持IPv4和IPv6
    if (!filter_var($ip, FILTER_VALIDATE_IP)) {
        $ip = '';
    }

    return $ip;
}

EMLOG

收到1条评论
avatar
666 23 天前
66666
回复