如何使用PHP简化IP地址?尝试使用long2ip(ip2long(address))

时间:2019-02-05 15:49:16

标签: php ip2long

我的系统包括一个第三方框,用于存储IP地址并将其与从我的Web界面发送的值进行比较。我有一个问题,用户输入第三方框的网络掩码为255.255.255.000,并且该框将其存储为255.255.255.0。但是,下次该框重新启动并被告知掩码包含000时,它得出以下结论:这些值不同,并更新其数据库并重新启动。并重新启动。然后重新启动。

我的目的是通过将网络掩码以简化形式255.255.255.0存储在我自己的系统中(以及另一个示例,以10.1.2.5存储010.001.002.005)来解决此问题。但是我是PHP的新手。我尝试使用代码$mask = long2ip(ip2long($mask))将条目转换为标准化格式,但刚返回0.0.0.0。我需要做些特殊的事情来将IP转换为长时转换吗?有没有更好的方法可以简化这一点?

3 个答案:

答案 0 :(得分:1)

ip2long在发生错误时返回false,并且似乎没有检测到000为有效。由于未检测到255.255.255.000为有效IP,因此它将返回false,因此long2ip(false)不会吐出有效IP。

您甚至可以在接受IP地址之前检查ip2long(input)是否返回true。进行适当的验证将防止无效的IP破坏系统。试图对所有可能的无效IP地址实施自动校正要比仅仅强制执行一个有效IP困难得多。

答案 1 :(得分:1)

要遵循@ka_lin在评论中的建议,只需将其分解为多个部分,将其转换为一个整数,该整数将删除前导0并进行内爆重建...

$mask = implode(".", array_map("intval", explode(".", $mask)));

一个简单且开销较小的版本假定IP地址由4部分组成...

list ($o1, $o2, $o3, $o4) = explode(".", $mask);
$mask = (int)$o1.".".(int)$o2.".".(int)$o3.".".(int)$o4;

很难,因为010.001.002.005是有效的IP地址,但也可能造成混淆(有时以0开头的数字为八进制)。

答案 2 :(得分:1)

注释:ip2long()有一个问题:它不接受有效的IP地址127.1(经典的表示法,但是有效!)或127.0.0.010(RFC表示无效,但大多数人将010读为八进制数字)。

如果是gethostbyname(),则为备用。但是gethostbyname()也存在问题:如果输入了无效的IP(例如127.0.0.1234),则将进行DNS查找,如果查找失败,则返回源。

解决方案可以是:

long2ip(ip2long(gethostbyname($IP_ADDRESS)))

我的个人解决方案是以下功能:

function aton ( $addr )
{
    $l = explode('.',$addr);
    switch (count($l))
    {
        case 0: return FALSE;

        case 1: return intval($l[0]) & 0xffffffff;

        case 2: return  ( intval($l[0]) << 24
                        | intval($l[1])
                        ) & 0xffffffff;

        case 3: return  ( intval($l[0]) << 24
                        | intval($l[1]) << 16
                        | intval($l[2])
                        ) & 0xffffffff;

        default: return ( intval($l[0]) << 24
                        | intval($l[1]) << 16
                        | intval($l[2]) <<  8
                        | intval($l[3])
                        ) & 0xffffffff;
    }
}

使用此功能,您可以使用:

long2ip(aton($IP_ADDRESS))

顺便说一句,我从来没有遇到过像255.255.255.0这样的特殊IP地址的问题。