0

我的系统包括一个第三方盒子,它存储 IP 地址并将它们与从我的 Web 界面发送的值进行比较。我有一个问题,用户将第三方盒子的网络掩码输入为 255.255.255.000,而盒子将其存储为 255.255.255.0。然而,下次盒子重新启动并被告知掩码包含 000 时,它会断定这些值不同,并更新其数据库并重新启动。并重新启动。并重新启动。

我的意图是通过将网络掩码以简化形式 255.255.255.0 存储在我自己的系统中来解决这个问题(作为另一个示例,将 010.001.002.005 存储为 10.1.2.5)。但我是 PHP 的新手。我尝试$mask = long2ip(ip2long($mask))了将条目转换为标准化形式的代码,但只得到了 0.0.0.0。我需要做一些特别的事情来将 IP 转换为 long 和 back 吗?有没有更好的方法来简化这个?

4

3 回答 3

2

要遵循@ka_lin 在评论中的建议,只需将其分解为多个部分,将其转换为 int 将删除前导 0 并使用 implode 重建它...

$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 开头的数字是八进制)。

于 2019-02-05T16:17:17.587 回答
1

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

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

于 2019-02-05T15:54:51.220 回答
1

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

替代方案 if 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.

于 2019-02-05T16:24:10.043 回答