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

hykeda11个月前PHP1258

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

相关文章

PHP防注入函数使用

htmlspecialchars 防止xss注入ENT_COMPAT - 默认。仅编码双引号。ENT_QUOTES - 编码双引号和单引号。ENT_NOQUOTES - 不编码任何引号。默认是只编码双...

关于PHP处理BOM头的问题

关于php出现无法解析数据,直接var_dump出来为string(3)"",必须警觉,极大可能就是存在bom头的问题,比如接收json数据 $rt = json_decode($r...

php 用curl 进行数据post给接口,如何将数据存放至body中传递

有个项目,将数据推送至接口文件,代码入下:$headers[]  =  "Accept:application/json";$headers[]  =...

discuzX3.2 用户注册接口代码

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

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

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

php json_encode输出空白问题

php json_encode输出空白问题

例如这样的一段转json出现空白: echo json_encode(array('error' => '0', 'message' => '没有错误')); var_dump(js...

发表评论    

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