0

我有这个检测 ipv4 的代码:

public static function isSubnet($ip = NULL)
{
    $remoteAddr = (!isset($_SERVER['HTTP_X_FORWARDED_FOR']) && isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : NULL);
    $ip = strToLower(is_null($ip) ? $remoteAddr : $ip);

    $part = explode('.', $ip);
    // 10.0.0.0/8   Private network
    // 127.0.0.0/8  Loopback
    // 169.254.0.0/16 & ::1  Link-Local
    // 172.16.0.0/12  Private network
    // 192.168.0.0/16  Private network
    if (count($part) === 4 && ($part[0] === '10' || $part[0] === '127' || ($part[0] === '172' && $part[1] < 16 && $part[1] > 31)
        || ($part[0] === '169' && $part[1] === '254') || ($part[0] === '192' && $part[1] === '168'))
    ) {

        return TRUE;

    }

    return FALSE;
}
  1. 这是检测 ipv4 子网的正确方法还是您对此有更好的想法?如果是,请给我一个例子(代码)。
  2. 如果可能,如何检测 ipv6 的子网?
4

1 回答 1

3

PHP 有内置机制来验证一些常见类型,对于您的情况,它将是:

$isIP = filter_var($ip, FILTER_VALIDATE_IP);

$isSubnet = !filter_var($ip, FILTER_VALIDATE_IP, 
    FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE
);

return $isIP && $isSubnet;

您可以FILTER_FLAG_IPV4/6在第一次检查中用作第三个参数以确保所需的格式。

于 2013-07-20T18:03:20.167 回答