PHP 中比较 IP 地址与通配符的优化方法?

2024-03-17

任何人都知道一种有效且安全的方法来查看此输入是否:

$_SERVER['REMOTE_ADDR']

与类似于此不一致过滤器数组的内容匹配(请注意,200.100.*.* 可以仅表示为 200.100.*),并使用 * 表示的通配符:

array(
  '192.168.1.*',
  '192.168.2.1*',
  '10.0.0.*',
  '200.100.*.*',
  '300.200.*',
)

Update

想法?

foreach($instanceSettings['accessControl']['allowedIpV4Addresses'] as $ipV4Address) {
    echo 'Now checking against '.$ipV4Address.'.';

    // Compare each octet
    $ipV4AddressOctets = String::explode('.', $ipV4Address);
    $remoteIpV4AddressOctets = String::explode('.', $_SERVER['REMOTE_ADDR']);
    $remoteIpV4AddressIsAllowed = true;
    for($i = 0; $i < Arr::size($ipV4AddressOctets); $i++) {
        echo 'Comparing '.$ipV4AddressOctets[$i].' against '.$remoteIpV4AddressOctets[$i].'.';
        if($ipV4AddressOctets[$i] != $remoteIpV4AddressOctets[$i] && $ipV4AddressOctets[$i] != '*') {
            echo 'No match.';
            $remoteIpV4AddressIsAllowed = false;
            break;
        }
    }

    // Get out of the foreach if we've found a match
    if($remoteIpV4AddressIsAllowed) {
        break;
    }
}

我还没有对此进行基准测试,但我会选择使用网络硬件/软件使用的方法......

将任意 * 替换为 0 和 255。 将 IP 转换为整数

因此,如果 255.255.255.* 变为 255.255.255.0 和 255.255.255.255 然后在这两个ip上执行ip2long函数。

然后你可以将给定的ip转换成长ip。例如 255.255.50.51 为长 ip。

然后你可以比较这个给定ip的长ip是否在黑名单中转换后的长ip之间。如果是则不允许,否则不允许。

$ips = array("ip1", "ip2");
foreach($ips as $ip){
 $ip1 = str_replace("*", "0", $ip);
 $ip2 = str_replace("*", "255", $ip);

 $ip1 = ip2long($ip1);
 $ip2 = ip2long($ip2);
 $givenip = $_GET["ip"];
 $givenip = ip2long($givenip);

 if($givenip >= $ip1 && $ip <= $givenip){
   echo "blacklist ip hit between {$ip1} and {$ip2} on {$ip}";
 }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 中比较 IP 地址与通配符的优化方法? 的相关文章

随机推荐