php限制IP和IP段的代码(白名单)

本文介绍了一段用于控制IP访问的PHP代码,并对其makePregIP函数进行了改进,使之能更有效地实现白名单功能。通过调整checkIP函数,还可轻松转换为黑名单模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

这段代码是我在网上搜相关解决方法时搜到的,这个类的makePregIP函数逻辑有点问题,我修改了下可以使用了。这个类得功能是允许白名单中的IP地址访问,如果要实现限制黑名单中的IP地址访问,简单修改下checkIP函数中的代码逻辑就可以了。

class allow_ip {

    var $allow_ip = array("192.168.1.1","210.10.2.1-20","222.34.4.*","127.0.0.1");

    function __construct(){
        
    }

    function __destruct(){
        
    }

    private function makePregIP($str)
    {
        if (strstr($str,"-")) {
            
            $aIP = explode(".",$str);
            
            foreach ($aIP as $k=>$v) {
                if (!strstr($v,"-")) {
                    $preg_limit .= $this->makePregIP($v);
                    $preg_limit .= ".";
                } else{
                    $aipNum = explode("-",$v);
                    for($i=$aipNum[0];$i<=$aipNum[1];$i++){
                        $preg .=$preg?"|".$i:"[".$i;
                    }
                    $preg_limit .=strrpos($preg_limit,".",1)==(strlen($preg_limit)-1)?$preg."]":".".$preg."]";
                }
            }
        } 
        else {
            $preg_limit = $str;
        }

        return $preg_limit;
    }

    private function getAllBlockIP(){
        
        if ($this->allow_ip) {
            $i = 1;
            foreach ($this->allow_ip as $k=>$v) {
                $ipaddres = $this->makePregIP($v);

                $ip = str_ireplace(".","\.",$ipaddres);
                $ip = str_replace("*","[0-9]{1,3}",$ip);
                $ipaddres = "/".$ip."/";
                $ip_list[] = $ipaddres;
                $i++;
            }
        }
        return $ip_list;
    }

    public function checkIP() {
        
        $iptable = $this->getAllBlockIP();
        $IsJoined = false;
        //取得用户ip
        $Ip = $this->get_client_ip();
        $Ip = trim($Ip);
        //在白名单中返回真
        if ($iptable) {
            foreach($iptable as $value) {
                if (preg_match("{$value}",$Ip)) {
                    $IsJoined = true;
                    break;
                }
            }
        }
        //不在白名单中禁止访问 本文地址:http://www.jiazhengjing.com/article/19.html
        if( !$IsJoined ){
            echo "IP Error";
            return false;
        }
        return true;
    }

    private function get_client_ip(){
        
        if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
            $ip = getenv("HTTP_CLIENT_IP");
        else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
            $ip = getenv("HTTP_X_FORWARDED_FOR");
        else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
            $ip = getenv("REMOTE_ADDR");
        else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
            $ip = $_SERVER['REMOTE_ADDR'];
        else
            $ip = "unknown";
        
        echo $ip;
        return($ip);
   }
}

    $oBlock_ip = new allow_ip();
    if( !$oBlock_ip->checkIP() ) exit;
?>


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值