我的系统包括一个第三方框,用于存储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转换为长时转换吗?有没有更好的方法可以简化这一点?
答案 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地址的问题。