检测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

相关文章

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

Python实现合并与拆分多个PDF文档中的指定页

《Python实现合并与拆分多个PDF文档中的指定页》这篇文章主要为大家详细介绍了如何使用Python实现将多个PDF文档中的指定页合并生成新的PDF以及拆分PDF,感兴趣的小伙伴可以参考一下... 安装所需要的库pip install PyPDF2 -i https://pypi.tuna.tsingh

Linux配置IP地址的三种实现方式

《Linux配置IP地址的三种实现方式》:本文主要介绍Linux配置IP地址的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录环境RedHat9第一种安装 直接配置网卡文件第二种方式 nmcli(Networkmanager command-line

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

Flask解决指定端口无法生效问题

《Flask解决指定端口无法生效问题》文章讲述了在使用PyCharm开发Flask应用时,启动地址与手动指定的IP端口不一致的问题,通过修改PyCharm的运行配置,将Flask项目的运行模式从Fla... 目录android问题重现解决方案问题重现手动指定的IP端口是app.run(host='0.0.

Nginx实现动态封禁IP的步骤指南

《Nginx实现动态封禁IP的步骤指南》在日常的生产环境中,网站可能会遭遇恶意请求、DDoS攻击或其他有害的访问行为,为了应对这些情况,动态封禁IP是一项十分重要的安全策略,本篇博客将介绍如何通过NG... 目录1、简述2、实现方式3、使用 fail2ban 动态封禁3.1 安装 fail2ban3.2 配

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D