1

我偶然发现了以下问题:

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

echo long2ip(ip2long("127.0.255"));

正确答案是:“127.0.255.0”。

虽然这似乎是合乎逻辑的,因为php 手册中提到了这种行为,甚至在德国手册中也有一个例子,但我在重现它时遇到了问题。

我的代码产生以下输出:

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

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

  • PHP 5.3.3-7+squeeze15 与 Suhosin-Patch
  • Suhosin 补丁 0.9.9.1

我的同事都无法给我一个准确的解释。我们唯一的假设是,它可能与 Suhosin-Patch 冲突。

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

4

3 回答 3

1

PHP 手册还指出(http://de1.php.net/manual/en/function.ip2long.php):

变更日志

版本说明

5.2.10 在此版本之前,ip2long() 有时会返回一个有效数字,即使传递的值不是 (IPv4) 互联网协议点分地址。

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

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

于 2013-05-28T09:29:06.463 回答
1

如果您ip2long用于 IP 验证,我建议您filter_var($ip, FILTER_VALIDATE_IP改用。

PHP过滤器验证

于 2013-05-28T09:29:22.397 回答
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。

于 2013-05-28T12:12:09.950 回答