2013-05-28 34 views
1

我在遇到以下问题时遇到了问题:非完整IP地址和ip2long()

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

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 + squeeze15用了Suhosin贴片
  • 了Suhosin补丁0.9.9.1

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

如果你有一个解释,请让我知道。

+0

我不跑Suhosin,而且我有和你一样的输出 - '0.0.0.0'。版本是PHP 5.4.14。 –

回答

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衍生品都没有这样的后备。

+0

是的,我读过这个。但描述仍然提到:“ip2long()也可以处理非完整的IP地址。” – tobyte

+0

@tobyte这是一个依赖于系统的实现;不要依赖这个。 – bwoebi

+0

似乎是这样。但是这个问题没有特别的答案,而且我的学习材料中的问题是错误的。 – tobyte

1

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

PHP filter validation

+0

ip2long验证工作太,你只需要检查!==假...(虽然它是推荐的方式) – bwoebi

+0

我实际上并不想使用此代码进行验证,这只是我学习资料中的一个问题。 – tobyte

+0

@bwoebi除了5.2.10之前的ip2long可以验证一个无效的IP,就像你在回答中显示的那样 - 'false === ip2long('1.2.3')'将在5.2.10之前验证为正确的IP – StampyCode