检测ip地址库内是否存在指定的ip

2024-03-20 15:38

本文主要是介绍检测ip地址库内是否存在指定的ip,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

检测ip地址库内是否存在指定的ip,支持精确匹配、尾部*号匹配及ip区间匹配。

应用场景:ip 白名单 / 黑名单、系统后台限制内网访问等。

/*** 检测ip地址库内是否存在指定的ip,支持精确匹配、尾部*号匹配及ip区间匹配* @param string $ip 待检测的ip字符串* @param array $ipList ip数组列表,该参数为空时,忽略检测* @return bool true 地址库为空 或 地址库内存在指定的ip | false 地址库内不存在指定的ip*/public function filterIP($ip,$ipList=array()) {if (!$ipList) {return true;}// 优先精确匹配if (in_array($ip,$ipList)) {return true;}$ip_tmp = explode('.',$ip);$ip_tmp_pad = $ip_tmp;array_walk($ip_tmp_pad,function(&$value,$key){$value = str_pad(strval($value), 3, '0', STR_PAD_LEFT);});$ip_tmp_long = implode('',$ip_tmp_pad);// ip段区间匹配foreach ($ipList as $ipItem) {if (strpos($ipItem,'-') === false) {continue;}$ip_item_tmp = explode('-',$ipItem);// 起始ip$ip_start = trim($ip_item_tmp[0]);$ip_start_arr = explode('.',$ip_start);array_walk($ip_start_arr,function(&$value,$key){$value = str_pad(strval($value), 3, '0', STR_PAD_LEFT);});$ip_start = implode('',$ip_start_arr);// 截止ip$ip_end = trim($ip_item_tmp[1]);$ip_end_arr = explode('.',$ip_end);array_walk($ip_end_arr,function(&$value,$key){$value = str_pad(strval($value), 3, '0', STR_PAD_LEFT);});$ip_end = implode('',$ip_end_arr);if ($ip_tmp_long >= $ip_start && $ip_tmp_long <= $ip_end) {return true;}}// 模糊匹配处理$flag = false;foreach ($ipList as $ipItem) {$ip_item_tmp = explode('.',$ipItem);if ($ip_item_tmp[0] == '*') {$flag = true;break;}// ip第1段if ($ip_item_tmp[0] == $ip_tmp[0] && $ip_item_tmp[1] == '*') {$flag = true;break;}// ip第2段if ($ip_item_tmp[0] == $ip_tmp[0] && $ip_item_tmp[1] == $ip_tmp[1] && $ip_item_tmp[2] == '*') {$flag = true;break;}// ip第3段if ($ip_item_tmp[0] == $ip_tmp[0] && $ip_item_tmp[1] == $ip_tmp[1] && $ip_item_tmp[2] == $ip_tmp[2] && $ip_item_tmp[3] == '*') {$flag = true;break;}// ip第4段if ($ip_item_tmp[0] == $ip_tmp[0] && $ip_item_tmp[1] == $ip_tmp[1] && $ip_item_tmp[2] == $ip_tmp[2] && $ip_item_tmp[3] == $ip_tmp[3]) {$flag = true;break;}}return $flag;}

 

这篇关于检测ip地址库内是否存在指定的ip的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/829940

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet

Python脚本轻松实现检测麦克风功能

《Python脚本轻松实现检测麦克风功能》在进行音频处理或开发需要使用麦克风的应用程序时,确保麦克风功能正常是非常重要的,本文将介绍一个简单的Python脚本,能够帮助我们检测本地麦克风的功能,需要的... 目录轻松检测麦克风功能脚本介绍一、python环境准备二、代码解析三、使用方法四、知识扩展轻松检测麦

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

java -jar example.jar 产生的日志输出到指定文件的方法

《java-jarexample.jar产生的日志输出到指定文件的方法》这篇文章给大家介绍java-jarexample.jar产生的日志输出到指定文件的方法,本文给大家介绍的非常详细,对大家的... 目录怎么让 Java -jar example.jar 产生的日志输出到指定文件一、方法1:使用重定向1、

基于Python实现数字限制在指定范围内的五种方式

《基于Python实现数字限制在指定范围内的五种方式》在编程中,数字范围限制是常见需求,无论是游戏开发中的角色属性值、金融计算中的利率调整,还是传感器数据处理中的异常值过滤,都需要将数字控制在合理范围... 目录引言一、基础条件判断法二、数学运算巧解法三、装饰器模式法四、自定义类封装法五、NumPy数组处理

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon