如何在PHP中检查IP范围是否是私有的?

如何在PHP中检查IP范围是否是私有的?,php,Php,我看到的关于在PHP中验证私有IP的大多数问题都与验证特定IP地址是否私有有关,或者IP是否存在于特定范围内有关 但是,我希望能够在PHP中确定以“X.X.X.X-Y.Y.Y.Y”格式给出的IP范围是否为专用范围。很清楚,我想看看整个范围是否是私有的。示例: 10.0.0.1-10.0.0.14将返回true,因为此范围内的所有IP都是内部IP 10.0.0.1-127.0.0.16将返回false,因为该范围内并非所有IP都是内部/专用的,即使起点和终点都是 我最初的想法是验证起始IP和结束I

我看到的关于在PHP中验证私有IP的大多数问题都与验证特定IP地址是否私有有关,或者IP是否存在于特定范围内有关

但是,我希望能够在PHP中确定以“X.X.X.X-Y.Y.Y.Y”格式给出的IP范围是否为专用范围。很清楚,我想看看整个范围是否是私有的。示例:

10.0.0.1-10.0.0.14
将返回true,因为此范围内的所有IP都是内部IP

10.0.0.1-127.0.0.16
将返回false,因为该范围内并非所有IP都是内部/专用的,即使起点和终点都是

我最初的想法是验证起始IP和结束IP,如果它们是内部的,那么一切都好。但是,正如我上面所说,如果我有一个像
$range='10.0.0.1-127.0.0.16'
这样的范围,虽然起始和结束IP地址都被认为是私有IP地址,但它跨越的IP地址不是内部的,因此它不是唯一的内部IP地址范围

我也许可以生成范围内的每个IP地址,并验证每个地址,但这似乎效率极低

有没有更简单、更有效的方法

编辑:只是为了让那些将此标记为重复的人更清楚:我不尝试验证单个给定IP,看看它是否是私有的。我想检查
$range='10.0.0.1-127.0.0.16'
格式的给定范围内的每个可能的IP都是私有的。这样做速度太慢,效率太低(假设我分解了字符串以获得起始和结束IP地址):


IP空间中的所有私有范围由公共范围分隔(
p
用于私有,
用于公共):

如果希望用户定义的范围完全私有,则需要将其完全包含在其中一个私有范围中(
u
对于用户定义的所有私有范围=点击,
x
对于错误的范围,失败):

因此,我们需要检查两个输入值(
$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);

}
函数检查范围($start,$end)
{
$start=ip2long($start);
$end=ip2long($end);
如果(!$start | |!$end)
抛出新异常(“无效输入”);
如果($start>$end)
抛出新异常('无效范围');//可选选项:开关$start和$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_start&&$end=$range2_start&&$start=$range2_start&&$end=$range3_start&&$start=$range3_start&$endIP地址是一个32位的数字。它可以用一个句点分隔的四位小数表示,每个小数点是以10为基数的32位数字的8位。 PHP的内置功能将IPv4字符串表示法转换为标准的32位整数

考虑到这一点(IPv4字符串表示法字符串仅为32位整数),您可以很容易地提出一种算法来检查整数是否在某个范围内或某个范围是否在另一个范围内

<?php

function check($start, $end) {
    $r10Start = ip2long('10.0.0.0');
    $r10End = ip2long('10.255.255.255');

    $r127Start = ip2long('127.0.0.0');
    $r127End = ip2long('127.255.255.255');

    if (
        ($start >= $r10Start && $end <= $r10End)
        || ($start >= $r127Start && $end <= $r127End)
    ) {
        return true;
    }

    return false;
}

var_dump(check(ip2long('10.0.0.1'), ip2long('10.0.0.14')));
var_dump(check(ip2long('10.0.0.1'), ip2long('127.0.0.16')));

在线ipv4地址?如果您拆分为地址,则可以执行
$sections=explode('.',$ip_range)
如果($sections[0]==192&&$sections[1]==168)|($sections[0]==172&($sections[1]>=16&$sections[1]使用,所以它只比定义的私有范围检查少/多。可能重复@iXCray正如我所说的,我不想检查IP地址是否私有,我想检查
10.0.0.1-127.0.0.16格式的整个定义范围是否私有,即该范围内的每个可能IP都是私有的。可能du在我的上下文中,没有要求两个IP地址必须是同一个私有范围的一部分。如果它们是不同私有范围的一部分,则它们之间将存在公共范围。因此,两个地址之间的范围肯定不都是私有的。这就是第二个示例返回
false
的原因。
__ppp___pppp___ppp___
   uu
  u
    xxxxxxx
          uu
               u
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

function check($start, $end) {
    $r10Start = ip2long('10.0.0.0');
    $r10End = ip2long('10.255.255.255');

    $r127Start = ip2long('127.0.0.0');
    $r127End = ip2long('127.255.255.255');

    if (
        ($start >= $r10Start && $end <= $r10End)
        || ($start >= $r127Start && $end <= $r127End)
    ) {
        return true;
    }

    return false;
}

var_dump(check(ip2long('10.0.0.1'), ip2long('10.0.0.14')));
var_dump(check(ip2long('10.0.0.1'), ip2long('127.0.0.16')));