我有下面的函数,它接受一个IP cidr或单个IP的数组,如下所示:
$cidrs = array("127.0.0.1","65.87.43.65/32");
等。
然后,该函数检查给定的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;
}
我不能为我的生活解决为什么它不再工作 - 我已经失去了很多时间!
答案 0 :(得分: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;
}