龙行博客

走路看风景,经历看人生,岁月留痕迹,人生留轨迹,17的历史,18的豪情,时间的匆忙,人生的风景,放开心胸往前走,成功再远行,放开理想往前走,梦想再行动。
现在位置:首页 > 编程语言 > PHP > php检测IP是否在IP段范围内封装类

php检测IP是否在IP段范围内封装类

龙行    PHP    2019-5-18    277    0评论    百度未收录

检测ip是否在一个指定范围网段里面,如果在里面返回true,不存在返回false和msg错误信息

代码:

<?php
/**
* 说明:检测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;

评论一下 分享本文 赞助站长

赞助站长X

扫码赞助站长
联系站长
龙行博客
  • 版权申明:此文如未标注转载均为本站原创,自由转载请表明出处《龙行博客》。
  • 本文网址:https://www.liaotaoo.cn/221.html
  • 上篇文章:php高效统计txt大文件行数函数
  • 下篇文章:mysql-sql语句去除前后空白字符
  • php
挤眼 亲亲 咆哮 开心 想想 可怜 糗大了 委屈 哈哈 小声点 右哼哼 左哼哼 疑问 坏笑 赚钱啦 悲伤 耍酷 勾引 厉害 握手 耶 嘻嘻 害羞 鼓掌 馋嘴 抓狂 抱抱 围观 威武 给力
提交评论

清空信息
关闭评论
快捷导航
联系博主
在线壁纸
给我留言
光羽影视
音乐欣赏
返回顶部