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

Kir*_*met 8 php string performance

任何人都知道一种有效而安全的方法来查看这个输入:

$_SERVER['REMOTE_ADDR']
Run Code Online (Sandbox Code Playgroud)

匹配类似于这个不一致过滤器数组的东西(请注意200.100.*.*可以表示为200.100.*),并用*表示通配符:

array(
  '192.168.1.*',
  '192.168.2.1*',
  '10.0.0.*',
  '200.100.*.*',
  '300.200.*',
)
Run Code Online (Sandbox Code Playgroud)

更新

思考?

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Anu*_*ush 9

我没有标记这一点,但我会选择使用网络硬件/软件使用的方法...

将任何*替换为0和255.将IP转换为整数

所以如果255.255.255.*变成255.255.255.0和255.255.255.255然后在这两个ips上执行ip2long函数.

然后你可以将给定的ip转换为long ip.例如255.255.50.51进入长ip.

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

$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}";
 }
}
Run Code Online (Sandbox Code Playgroud)

  • 列表中的第二个IP会破坏你的解决方案:`192.168.2.1*`将变为`192.168.2.10`和`192.168.2.1255`.虽然第一个不是我们想要的,但第二个是完全非法的IP地址:) (2认同)
  • 为了检测范围 xxx0 - xxx255 ,`$ip &lt;= $givenip` 不应该变成 `$givenip &lt;= $ip2` 吗? (2认同)

web*_*ave 5

删除星号,然后执行以下操作:

$ips = array('192.168.1.', '10.0.0.');

foreach ($ips as $ip) {
    if (strpos($_SERVER['REMOTE_ADDR'], $ip) === 0) {
        // match
    }
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*ith 1

为什么不直接使用正则表达式呢?

 preg_match("((192\\.168\\.1)|(10\\.0\\.0)|(127\\.0\\.0)\\.[012]\\d{0,2}|(\\:\\:1))",$_SERVER['REMOTE_ADDR'])
Run Code Online (Sandbox Code Playgroud)