博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP怎么判断是不是在某个段内,PHP判断IP是否在指定IP段内的类
阅读量:5223 次
发布时间:2019-06-14

本文共 3374 字,大约阅读时间需要 11 分钟。

说明:

检测一个IP地址是否在规定网段内的类。IP在指定IP段范围内的话返回TRUE和信息“IP检测通过”,IP不在IP段范围内则返回FALSE和错误信息,错误信息可以从属性“msg”中获得,详见用法和代码。

代码:

/**

* 说明:检测IP是否在IP段内

* 作者:upall

*/

class ipCheck {

public $ipRangeStr = '10.0.0.1/8';

public $msg = '';

function __construct($ipRangeStr){

!empty($ipRangeStr) ? $this->ipRangeStr = $ipRangeStr : '';

}

function check($ip = '') {

empty($ip) && $ip = $this->getClientIp();

# 判断检测类型

if (FALSE !== strpos($this->ipRangeStr,'-')){

$type = 'size'; // 简单比大小:10.0.0.1-254 OR 10.0.0.1-10.0.0.254

}else if(FALSE !== strpos($this->ipRangeStr,'/')){

$type = 'mask'; // 掩码比大小:10.0.0.1/24

}else{

$this->msg = '错误的IP范围值';

return FALSE;

}

# 分析IP范围

if ('size' === $type){

$ipRangeStr = explode('-',$this->ipRangeStr);

$ipAllowStart = $ipRangeStr[0];

$ipAllowEnd = $ipRangeStr[1];

if (FALSE === strpos($ipAllowEnd,'.')){ # 10.0.0.254 OR 254

$ipAllowElmArray = explode('.',$ipAllowStart);

$ipAllowEnd = $ipAllowElmArray[0] . '.' .

$ipAllowElmArray[1] . '.' .

$ipAllowElmArray[2] . '.' .

$ipAllowEnd;

}

}else if ('mask' === $type){

$ipRangeStr = explode('/',$this->ipRangeStr);

$ipRangeIP = $ipRangeStr[0];

# 获取掩码中最后一位非零数的值

$ipRangeMask = (int)$ipRangeStr[1];

$maskElmNumber = floor($ipRangeMask/8); # 保留IP前几段

$maskElmLastLen = $ipRangeMask % 8; # 255.255.here.0

$maskElmLast = str_repeat(1,8-$maskElmLastLen);

$maskElmLast = bindec($maskElmLast); # 掩码中IP末段最大值(十进制)

// 获取IP段开始、结束值

$ipRangeIPElmArray = explode('.',$ipRangeIP);

if (0 == $maskElmNumber){

$ipAllowStart = '0.0.0.0';

$ipAllowEnd = $maskElmLast . '.254.254.254';

}else if (1 == $maskElmNumber){

$ipAllowStart = $ipRangeIPElmArray[0] . '.' . '0.0.0';

$ipAllowEnd = $ipRangeIPElmArray[0] . '.' . $maskElmLast . '.254.254';

}else if (2 == $maskElmNumber){

$ipAllowStart = $ipRangeIPElmArray[0] . '.' . $ipRangeIPElmArray[1] . '.' . '0.0';

$ipAllowEnd = $ipRangeIPElmArray[0] . '.' . $ipRangeIPElmArray[1] . '.' . $maskElmLast . '.254';

}else if (3 == $maskElmNumber){

$ipAllowStart = $ipRangeIPElmArray[0] . '.' . $ipRangeIPElmArray[1] . '.' . $ipRangeIPElmArray[2] . '.' . '0';

$ipAllowEnd = $ipRangeIPElmArray[0] . '.' . $ipRangeIPElmArray[1] . '.' . $ipRangeIPElmArray[2] . '.' . $maskElmLast;

}else if (4 == $maskElmNumber){

$ipAllowEnd = $ipAllowStart = $ipRangeIP;

}else{

$this->msg = '错误的IP段数据';

return $this->msg;

}

}else{

$this->msg = '错误的IP段类型';

return $this->msg;

}

// 检测IP

$ipAllowStart = $this->getDecIp($ipAllowStart);

$ipAllowEnd = $this->getDecIp($ipAllowEnd);

$ip = $this->getDecIp($ip);

if (!empty($ip)){

if ($ip <= $ipAllowEnd && $ip >= $ipAllowStart){

$this->msg = 'IP检测通过';

return TRUE;

}else{

$this->msg = '此为被限制IP';

return FALSE;

}

}else{

FALSE === ($this->msg) && $this->msg == '没有提供待检测IP'; // getClentIp() 是否返回false

return $this->msg; // 没有获取到客户端IP,返回

}

}

// 10进制IP

function getDecIp($ip){

$ip = explode(".", $ip);

return $ip[0]*255*255*255+$ip[1]*255*255+$ip[2]*255+$ip[3];

}

// 获取客户端IP

function getClientIp(){

if(isset($_SERVER['REMOTE_ADDR'])){

return $_SERVER['REMOTE_ADDR'];

}else{

$this->msg = '不能获取客户端IP';

return FALSE;

}

}

}

?>

用法:

$ipCheck = new ipCheck('192.168.1.1-192.168.1.254');

echo (TRUE === $ipCheck ->check('192.168.1.45')) ? '在范围内' : $ipCheck->msg;

$ipCheck = new ipCheck('192.168.1.1-254');

echo (TRUE === $ipCheck ->check('192.168.1.45')) ? '在范围内' : $ipCheck->msg;

$ipCheck = new ipCheck('192.168.1.1/24');

echo (TRUE === $ipCheck ->check('192.168.1.45')) ? '在范围内' : $ipCheck->msg;

转载地址:http://ulatv.baihongyu.com/

你可能感兴趣的文章
HDU-4461 The Power of Xiangqi 签到题
查看>>
nginx反向代理、优化
查看>>
Gradle
查看>>
js 取消事件冒泡
查看>>
第二轮冲刺第八天
查看>>
Web for Pentester -- sql注入
查看>>
js css等静态文件版本控制,一处配置多处更新.net版【原创】
查看>>
R语言-缺失值处理2
查看>>
【LeetCode】Reverse Nodes in k-Group(k个一组翻转链表)
查看>>
13 Ways Companies Do Whatsapp Marketing & Support (May 2019)
查看>>
Codeforces1142D
查看>>
查询字符串中某个字符出现的位置数组
查看>>
解决“chrome正受到自动测试软件的控制”信息栏显示问题
查看>>
面试题总结(1-20)
查看>>
面向切面的spring
查看>>
VC++ Debug产生异常时中断程序执行Break on Exception
查看>>
dependencyManagement与dependencies区别
查看>>
苏州实习第二天记
查看>>
苏州实习第三天记
查看>>
placeholder兼容方法(兼容IE8以上浏览器)
查看>>