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;
?>


### PHP限制特定 IP 地址访问的方法 为了实现对特定 IP 地址的访问控制,在 PHP 中可以通过获取客户端 IP 并将其与预定义的允许列表进行匹配来完成。下面是一个具体的实现方式: #### 函数 `check_ip` 的设计 此函数用于验证当前请求者的 IP 是否属于预先设定的安全范围。 ```php <?php /** * 检查来访者IP是否位于许可范围内. */ function check_ip() { // 定义允许访问的IP地址 $allowed_ips = array( '192.168.2.*', // 局域网内某一 '127.0.0.1' // 本地回环接口 ); // 获取用户的实际IP地址 if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $client_ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $client_ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $client_ip = $_SERVER['REMOTE_ADDR']; } foreach ($allowed_ips as $pattern) { // 使用正则表达式处理通配符(*)的情况 $regex_pattern = str_replace('\*', '[\d]*', preg_quote($pattern)); if (preg_match("/^{$regex_pattern}$/", $client_ip)) { return true; // 如果匹配成功,则允许继续执行后续操作 } } header("HTTP/1.0 403 Forbidden"); echo "您所在的IP不在授权访问名单之内"; exit(); // 终止程序运行,防止未授权访问 } ?> ``` 上述代码展示了如何构建一个能够接受带有星号(`*`)作为通配符表示法的一部分模式字符串,并利用正则表达式的灵活性来进行精确匹配[^1]。 当接收到 HTTP 请求时,先尝试从不同的服务器变量中提取真实的客户机 IP 地址(考虑到可能存在的代理情况),再逐一比较这些 IP 配置好的白名单中的条目。一旦发现符合条件即放行;反之,则发送状态码为 403 的响应给浏览器并停止进一步的操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值