PHP检查IPAddress是否是本地的

时间:2014-06-04 17:03:11

标签: php networking ip

我可以检查一下ip是否在私人网络中吗?

<?php
function isLocalIPAddress($IPAddress)
{
    return ( !filter_var($IPAddress, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) );
}

var_dump( isLocalIPAddress('127.0.0.1') ); // false
var_dump( isLocalIPAddress('192.168.1.20') ); // true
var_dump( isLocalIPAddress('64.233.160.0') ); // false

为什么isLocalIPAddress('127.0.0.1')提供false而不是true

Isn&lt; 127.0.0.1私有IP?


更新

我使用的解决方案:

<?php
function isLocalIPAddress($IPAddress)
{
    if( strpos($IPAddress, '127.0.') === 0 )
        return true;

    return ( !filter_var($IPAddress, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) );
}

3 个答案:

答案 0 :(得分:5)

根据test run,我们可以看到PHP 5.2.0→5.3.5的输出是false,而PHP 5.3.6→7.0.0beta1和hhvm-3.3.1的输出→3.8.0是true

要解决您的问题,您可以检查php版本,如果它在第一个范围内添加:

function isLocalIPAddress($IPAddress)
{
    if($IPAddress == '127.0.0.1'){return true;} <-- add this
    return ( !filter_var($IPAddress, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) );
}

答案 1 :(得分:2)

filter_var($addr, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);

这是我的制作标志。这里不允许使用私有IP类和环回接口。

答案 2 :(得分:0)

根据http://www.php.net/manual/en/filter.filters.flags.php 127.0.0.1不包含在FILTER_FLAG_NO_PRIV_RANGE或FILTER_FLAG_NO_RES_RANGE中。

编辑:

还有一个关于如何处理环回的评论。