Anonymous 发表于 2022-10-24 15:44:05

php禁止多个IP访问,如何实现通配符

下面是我的代码只能完整IP的禁止访问不能支持通配符

<?php
$webip = "192.168.1.2|219.152.195.208|59.36.178.107";//禁止IP列表
$ip="192.168.1.1";//用户的IP
function IsNul($str){
        if (!is_string($str)) return false; /*是否是字符串类型*/
        if (empty($str)) return false; /*是否已设定*/
        if ($str=='') return false; /*是否为空*/
        return true;
}
function check_ip($arr_ip,$ip){
    $allip = explode('|',$arr_ip);
    if($allip){
      foreach($allip as $key){
            if(IsNul(strstr($ip,$key))){
                exit("禁止访问");
            }
      }
    }
}
check_ip($webip,$ip);

怎么实现通配符呢?
如果要禁止的IP列表如下怎么实现啊

$webip = "192.168.1.2|219.152.195.208|59.36.178.*|59.36.*.*";//禁止IP列表


还有大神吗?

Anonymous 发表于 2022-10-24 15:46:13

还有日了百度,怎么SO结果都一样,一篇文章N个采集结果,找不到实用的

Mr·√ 发表于 2022-10-24 17:22:07

function check_ip($arr_ip, $ip) {
      $allip = explode('|', $arr_ip);
      if ($allip) {
            foreach($allip as $key) {
                $key = str_replace('.*', '', $key);
                $key_len = strlen($key);
                if (substr($ip, 0, $key_len) == $key) {
                  exit("禁止访问");
                }
            }
      }
    }

能实现需求但不考虑性能影响的一种垃圾写法

Anonymous 发表于 2022-10-24 17:40:40

Mr·√ 发表于 2022-10-24 17:22
能实现需求但不考虑性能影响的一种垃圾写法

有没有更好的写法吖:lol:

娃哈哈 发表于 2022-10-24 17:51:01

肯定去 nginx 上操作啊

Anonymous 发表于 2022-10-24 17:56:45

娃哈哈 发表于 2022-10-24 17:51
肯定去 nginx 上操作啊

使用场景不方便在nginx上操作,使用在部份页面上,禁访有时限:cool:

漆黑风景 发表于 2022-10-24 18:31:43


$webip = "192.168.1.2|219.152.195.208|59.36.178.107";//禁止IP列表
$ip="192.168.1.1";//用户的IP
function check_ip($arr_ip, $ip) {
   $regexp= '#^('.str_replace(['.','*'],['\.','*']$arr_ip).')$#';
   return preg_match($regexp,$ip);
}

Anonymous 发表于 2022-10-24 18:49:25

漆黑风景 发表于 2022-10-24 18:31
$webip = "192.168.1.2|219.152.195.208|59.36.178.107";//禁止IP列表
$ip="192.168.1.1";//用户的IP
f ...

差点卡死,这个是?

coffee 发表于 2022-10-24 21:07:07


<?php
$ip = '192.168.1.122';
$deny_ips = '127.0.0.2, 192.168.1.*';

function check_ip($src_ip) {
    global $deny_ips;
    $plist = explode(',', $deny_ips);
    foreach($plist as $val) {
      $val = trim($val);
      $val = str_replace('*', '+', $val);
      $m = '^'.$val.'$';
      if(preg_match("/$m/", $src_ip)) {
            return true;
      }
    }
    return false;
}
var_dump(check_ip($ip));

凌弘 发表于 2022-10-25 00:53:01

本帖最后由 凌弘 于 2022-10-25 00:54 编辑

iis和nginx直接用规则不是更快?百度一下很多现成的
真佩服你们这些牛逼的码农,明明ctrl+c能解决非要自己牛逼轰轰的自己写一段。。。
页: [1]
查看完整版本: php禁止多个IP访问,如何实现通配符