php 是否在ip范围,如何检查PHP中IP范围是否私有?

拼搏现实的明天。 2023-01-15 08:18 206阅读 0赞

标签: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

发表评论

表情:
评论列表 (有 0 条评论,206人围观)

还没有评论,来说两句吧...

相关阅读