php 是否在ip范围,如何检查PHP中IP范围是否私有?
标签:php
我所见过的大多数有关在PHP中验证私有IP的问题都与验证特定IP地址是否为私有或IP是否在特定范围内有关.
但是,我希望能够在PHP中确定IP范围,例如以. “ X.X.X.X-Y.Y.Y.Y”是一个专用范围.显然,我想查看整个范围是否为私有.例子:
10.0.0.1-10.0.0.14将返回true,因为此范围内的所有IP都是内部IP.
10.0.0.1-127.0.0.16将返回false,因为即使起点和终点都是该范围内的IP也不是内部/专用的.
我最初的想法是仅验证起始IP和结束IP,如果它们是内部IP,那么一切都很好.但是,就像我上面说的,如果我有一个$range = ’10 .0.0.1-127.0.0.16’这样的范围,虽然起始IP地址和结束IP地址都被视为私有IP地址,但它会跨越非内部IP地址,因此它不是唯一的内部IP地址范围.
我也许可以生成范围内的每个IP地址,然后对每个IP地址进行验证,但这似乎效率很低.
有没有更简单,更有效的方法?
编辑:只是为了使那些将其标记为重复的人更加清楚:我不是在尝试验证单个给定IP并查看它是否为私有.我想检查给定范围内的每个可能的IP格式$range = ’10 .0.0.1-127.0.0.16’是否都是私有的.这样做太慢且效率低下(假设我已经分解了字符串以获取起始IP地址和结束IP地址):
function checkRange($start, $end)
{
$start = ip2long($start);
$end = ip2long($end);
for ($i = $start; $i <= $end; $i++) {
$ip = long2ip($i);
if (!filter_var(
$ip,
FILTER_VALIDATE_IP,
FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE | FILTER_FLAG_IPV4
)) {
continue;
}
return false;
}
return true;
}
解决方法:
IP空间中的所有私有范围都由公共范围分隔(p表示私有,_表示公共):
__ppp___pppp___ppp___
如果您希望用户定义的范围是完全私有的,则需要将其完全包含在其中一个私有范围内(用户定义的全私有范围的u =命中,错误范围的x失败):
__ppp___pppp___ppp___
uu
u
xxxxxxx
uu
u
因此,我们需要检查两个输入值($start和$end)是否不仅是私有的,而且还处于相同的私有范围内.
function checkRange($start, $end)
{
$start = ip2long($start);
$end = ip2long($end);
if (!$start || !$end)
throw new Exception(‘Invalid input.’);
if ($start > $end)
throw new Exception(‘Invalid range.’); // Alternative: switch $start and $end
$range1_start = ip2long(‘10.0.0.0’);
$range1_end = ip2long(‘10.255.255.255’);
$range2_start = ip2long(‘172.16.0.0’);
$range2_end = ip2long(‘172.31.255.255’);
$range3_start = ip2long(‘192.168.0.0’);
$range3_end = ip2long(‘192.168.255.255’);
return ($start >= $range1_start && $start <= $range1_end &&
$end >= $range1_start && $end <= $range1_end) ||
($start >= $range2_start && $start <= $range2_end &&
$end >= $range2_start && $end <= $range2_end) ||
($start >= $range3_start && $start <= $range3_end &&
$end >= $range3_start && $end <= $range3_end);
}
标签:php
来源: https://codeday.me/bug/20191111/2017362.html
还没有评论,来说两句吧...