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

hykeda1年前PHP1428

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 用curl 进行数据post给接口,如何将数据存放至body中传递

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

composer使用phpstudy的php环境,如果改变php版本如何处理

        首先安装composer后,先在系统的环境变量中添加php路径,比如之前的路径:C:\zhangsan\...

关于在linux下php扩展sqlsrv查询数据不正常,错误01004

前段时间将一个老php项目从windows移至centos7中,安装sqlsrv扩展等都挺顺利,安装过程写在另一篇文章中了。问题描述:原先在windows中没哟问题,部署到linux新服务器中出现一个...

php json_encode输出空白问题

php json_encode输出空白问题

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

centos7+php+sqlserver配置方法

这段时间迁移老项目,其中有一个项目使用php编写,放置在windows中,然后连接的是sqlserver数据库,现在将项目搬迁至centos中,需要配置环境。 系统环境: 1、centos...

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

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

发表评论    

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