一尘不染

将IP与PHP 5中的CIDR掩码匹配?

php

我正在寻找一种将给定IP4点缀四边形IP与CIDR表示掩码匹配的快速/简单方法。

我有一堆IP,我需要查看它们是否与IP范围匹配。

例:

$ips = array('10.2.1.100', '10.2.1.101', '10.5.1.100', '1.2.3.4');

foreach ($ips as $IP) {
    if (cidr_match($IP, '10.2.0.0/16') == true) {
        print "you're in the 10.2 subnet\n"; 
    }
}

会是什么cidr_match()模样?

它并不一定必须很简单,但是快速就可以了。仅使用内置/通用功能的任何东西都是一种奖励(因为我很可能会让一个人向我展示梨子中的某些东西,但这样做我不能依赖于梨子或该软件包安装在我的代码所在的位置)部署)。


阅读 293

收藏
2020-05-29

共1个答案

一尘不染

如果仅使用IPv4:

  • 用于ip2long()将IP和子网范围转换为长整数
  • 将/ xx转换为子网掩码
  • 进行按位“与”(即ip和mask)并检查“结果=子网”

这样的事情应该工作:

function cidr_match($ip, $range)
{
    list ($subnet, $bits) = explode('/', $range);
    if ($bits === null) {
        $bits = 32;
    }
    $ip = ip2long($ip);
    $subnet = ip2long($subnet);
    $mask = -1 << (32 - $bits);
    $subnet &= $mask; # nb: in case the supplied subnet wasn't correctly aligned
    return ($ip & $mask) == $subnet;
}
2020-05-29