我有以下函数,它接受一组IP cidr或单个IP,如下所示:
$cidrs = array("127.0.0.1","65.87.43.65/32");等等。
然后,该函数检查给定IP是否在IP和CIDR数组中侦听,是否在CIDR中,或者是否为指定的单个IP。
问题是,如果IP不包含CIDR掩码,则无论列表中的IP是什么,它都将始终返回true。
我确信它至少工作过一次,但是我不知道我做了什么改变使它的行为不同。
函数如下:
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;
}我无论如何也想不出为什么它不再工作了--我已经为此浪费了很多时间!
发布于 2013-03-24 05:54:55
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;
} https://stackoverflow.com/questions/15592450
复制相似问题