1

我有下面的函数,它接受一组 IP cidr 或单个 IP,如下所示:

$cidrs = array("127.0.0.1","65.87.43.65/32");

ETC..

然后该函数检查给定的 IP 是否在该 IP 和 CIDR 的数组中侦听,无论它是在 CIDR 中还是指定的单个 IP。

问题是,如果 IP 不包含 CIDR 掩码,那么它将始终返回 true - 无论列表中的 IP 是什么。

我确信它至少可以工作一次,但是我不知道我做了什么改变以使其表现不同。

功能如下:

function testIP($user_ip, $cidrs)   
{  
    $ipu = explode('.', $user_ip);  
    foreach ($ipu as &$v)  
        $v = str_pad(decbin($v), 8, '0', STR_PAD_LEFT);  

    $ipu = join('', $ipu);  
    $res = false;  

    foreach ($cidrs as $cidr)   
    {  

        $parts = explode('/', $cidr);  

        if (empty($parts))  
        {  
            if (in_array($user_ip, $cidrs))  
            {  
                $res = true;  
                break;  
            } 
            break;         
        }  



        $ipc = explode('.', $parts[0]);  

        foreach ($ipc as &$v) $v = str_pad(decbin($v), 8, '0', STR_PAD_LEFT);  

        $ipc = substr(join('', $ipc), 0, $parts[1]);  

        $ipux = substr($ipu, 0, $parts[1]);  
        $res = ($ipc === $ipux);  
        if ($res) break;  
    }  
    return $res;  
}

我一生都无法弄清楚为什么它不再起作用 - 我为此浪费了很多时间!

4

1 回答 1

1

explode将始终返回一个数组。你的if (empty(...检查失败了。if (count($parts)==1)那就试试$res = in_array($user_ip, $cidrs)

编辑:另外,不要中断,而是继续下一个 cidr:

    if (count($parts)==1)
    {  
        if (in_array($user_ip, $cidrs))  
        {  
            $res = true;  
            break;  
        } 
        continue;         
    }  
于 2013-03-23T21:54:55.390 回答