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

hykeda1年前PHP1879

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     //GCJ-02...

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

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

简单的高精度计算函数

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

php json_encode输出空白问题

php json_encode输出空白问题

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

关于PHP获取IP地址的几种方法

获取客户端的ip地址有3中方式: 1.REMOTE_ADDR:浏览当前页面的用户计算机的ip地址 2.HTTP_X_FORWARDED_FOR: 记录代理信息,会把每一层代理都记录 3.HTTP_C...

PHP防注入函数使用

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

发表评论    

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