非完整的IP地址和ip2long()

时间:2013-05-28 09:24:13

标签: php

我发现了以下问题:

“以下代码的输出是什么?”

echo long2ip(ip2long("127.0.255"));

正确答案是:“127.0.255.0”。

虽然php manual中提到了这种行为似乎合乎逻辑,并且在german manual中有一个例子,但是我的问题再现了它。

我的代码产生以下输出:

echo ip2long("127.0.255"); // outputs: FALSE
echo long2ip(ip2long("127.0.255")); //outputs: 0.0.0.0

我测试过的机器有以下软件版本:

  • PHP 5.3.3-7 + pushze15 with Suhosin-Patch
  • Suhosin Patch 0.9.9.1

我的同事们都没有给我一个确切的解释。 我们唯一的假设是它可能与Suhosin-Patch发生冲突。

如果您有解释,请告诉我。

3 个答案:

答案 0 :(得分:1)

PHP手册还说明了(http://de1.php.net/manual/en/function.ip2long.php):

  

更新日志

     

版本说明

     

5.2.10在此版本之前,即使传递的值不是(IPv4)Internet协议虚线地址,ip2long()有时也会返回有效数字。

因此,当您使用的是比5.2.9更新的版本时,它不再起作用了。

更新:但它可能会在某些系统上运行,因为依赖ip2long函数的inet_addr C函数不是C标准的一部分:每个系统都可能有自己的实现。其中一些实现具有无效IP地址的回退模式。你不应该依赖于此,因为大多数unix衍生品都没有这样的后备。

答案 1 :(得分:1)

如果您使用ip2long进行IP验证,建议您改用filter_var($ip, FILTER_VALIDATE_IP

PHP filter validation

答案 2 :(得分:1)

我查了ip2long的PHP源代码。

如果inet_pton可用,则使用inet_pton。另外使用了inet_addr。

inet_pton检查,如果ip的格式为ddd.ddd.ddd.ddd,则返回0。 http://man7.org/linux/man-pages/man3/inet_pton.3.html

如果使用inet_addr,那么ip的缺失部分将填充为0。