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

hykeda1年前PHP1591

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:/...

抓取页面出现乱码

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

file_get_contents和curl出现400 Bad Request问题

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

简单的高精度计算函数

/** PHP高精度计算 * @param string $type * @param $n * ...

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

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

查找附近geohash算法及实现 (PHP版本)

随着移动终端的普及,很多应用都基于LBS功能,附近的某某(餐馆、银行、妹纸等等)。 基础数据中,一般保存了目标位置的经纬度;利用用户提供的经纬度,进行对比,从而获得是否在附近。 目标:...

发表评论    

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