我发现了以下问题:
“以下代码的输出是什么?”
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
我测试过的机器有以下软件版本:
我的同事们都没有给我一个确切的解释。 我们唯一的假设是它可能与Suhosin-Patch发生冲突。
如果您有解释,请告诉我。
答案 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
。
答案 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。