PHP限制ip以及IP段是否允许访问,以及对ip子网的理解

hykeda2年前PHP2379

php 如何限制ip访问:

// 判断ip是否被允许
function isIpBlocked($clientIP,$blockedIPs) {
    foreach ($blockedIPs as $blocked) {
        // 检查是否为CIDR表示法
        if (strpos($blocked, '/') !== false) {
            list($subnet, $mask) = explode('/', $blocked);
            $mask = intval($mask);
            $subnet = ip2long($subnet);
            $clientIPLong = ip2long($clientIP);
            $wildcard = pow(2, (32 - $mask)) - 1;
            $netID = $subnet & ~$wildcard;
            if (($clientIPLong & ~$wildcard) == $netID) {
                return true; // 客户端IP在被禁止的子网段内
            }
        } else { // 如果是单个IP地址
            if ($blocked == $clientIP) {
                return true; // 客户端IP匹配被禁止的地址
            }
        }
    }
    return false; // 客户端IP不在被禁止的范围内
}

// 示例:不允许特定IP和一个子网段访问
$blockedIPs = array(
    '193.11.21.234', // 禁止这个特定IP
    '193.11.0.0/24',  // 或者这个子网段的任何IP
    '193.168.0.0/16'  // 或者这个子网段的任何IP
);

$clientIP = $_SERVER['REMOTE_ADDR'];

if (isIpBlocked($clientIP,$blockedIPs)) {
    die("禁止");
}

// 如果通过了检查
echo "Welcome!";

这里对ip中的类似193.11.0.0/24类似这样的IP段进行理解一下:

IP地址一共是32位,由4个是8位组成 ,分成A,B,C,3类地址。

这里的193.11.0.0/24 表示前面24位是一样的,就是193.11.0是一样的,而最后一位的0就是可变,从0~255,所以如果禁止193.11.0.0/24表示:禁止193.11.0.0~193.11.0.255这个IP段

同样的如果是193.11.0.0/16,说明是个B类地址,前16位是一样的,说明193.11后面的被禁止了,192.0.0.0/8也是类似的效果。

1、代码中$clientIP = '193.11.0.12',符合了193.168.0.0/24所以也是被禁止,但是193.11.1.0就不符合了,是被允许的。

2、代码中$clientIP = '193.168.1.12',符合了193.168.0.0/16所以也是被禁止


标签: IP限制php

相关文章

file_get_contents("php://input")的使用方法

$data = file_get_contents("php://input"); php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php:/...

discuzX3.2 用户注册接口代码

新建一个php文件在根目录,例:test.php test.php 具体内容: error_reporting(0); require_once './source/class/clas...

phpstudy提示错误:cURL error 60 配置SSL CA证书

phpstudy配置SSL CA证书本地Windows环境, phpstudy 集成 php7 后,出现错误提示:cURL error 60: SSL certificate pr...

file_get_contents和curl出现400 Bad Request问题

我在使用这两个函数抓取数据的时候出现了400错误,一开始以为是http和https的问题,以为https证书问题,忽略证书后还是报400,但是输入百度的网址都正常。 其实是url参数...

php导出EXCEL出现错误解决方法

由于数据量不多的增多,最近出现了导出excel的时候报错:Allowed memory size of 134217728 bytes exhausted (tried to allocate 114...

抓取页面出现乱码

在抓取页面的时候出现类似�������这样乱码解决方法如下 1、转换编码 str=mbconvertencoding(str=mbconvertencoding(...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。