有些项目可能会用到一个IP地址的白名单黑名单之类的验证。

比如,只有IP地址在白名单中,才可以访问该系统。

那么此时,白名单的维护,一般是一个文件,里边是一些IP地址(每行一个IP),当然也有的可能是用数据库记录白名单。

当然,即使放在数据库中记录(方便管理),也可以在后台根据数据库生成IP白名单的配置文件,每次更新白名单时,都根据数据库数据,重新写一下白名单的配置文件。

这里,假设白名单的IP地址是存储在一个文件中:while_ips.conf

一般常见的两种情况:一种是白名单文件中的所有IP都是完整的,另一种是有的IP是有范围的(带.*)

一、每一个IP都是完整的IP

 127.0.0.0
192.168.1.1
192.168.1.2
192.168.1.30
123.200.20.200
123.101.21.201

  以上假设就是IP白名单。

此时的思路是,从文件中读取所有IP地址写入一个数组,每行就是一个元素。

然后判断当前IP是否在这个数组中。这样就实现了这个IP是不是在白名单的验证。

这种实现,比较简单。

 function white_ips($file)
{
$a = [];
if (is_file($file)) {// 判断是不是文件
$f = fopen($file, 'r');// 只读的方式打开文件
while (!feof($f)) {// 判断你是否在文件尾,不是文件尾则循环
$s = fgets($f);// 每次读出一行
$s = preg_replace('/\s*/', '', $s);// 先过滤掉多余的空格和空白
if (substr($s, 0, 1) != '#' && $s != '') {// 如果不是注释行,或者空行
$a[] = $s;// 记录有效数据
}
}
fclose($f);
}
return $a;
}

  $file是IP白名单文件的存储位置和文件名,其中会过滤掉注释的IP,同时也会过滤掉多余的空白和换行。避免意外出错。

 $arr = getWhiteIps('white_ips.conf');
$ip = '192.168.1.1';
$allow = 0;
if (in_array($ip, $arr)) {
$allow = 1;
}
echo $allow;

  通过这样调用和判断,就可以知道当前的IP是否在白名单了。

二、第二种情况是白名单配置文件中是有范围的

 127.*.*.*
10.*.*.*
192.168.*. *
192.168.1.1
123.200.20.200
123.101.21.201
210.10.22.*
210.123.135.*
#30.11.22.33
#119.123.2.15

  以上是假设IP白名单的文件内容

  此时的思路是,从文件中读取所有IP地址写入一个数组,每行就是一个元素。

  然后通过循环的方式,将当前IP和数组中的每一条数据进行比较(匹配),如果匹配上则白名单,否则不是。

  此时因为有范围,所以不能使用in_array这种简单的判断了。需要使用正则来判断。

  读取白名单配置文件的代码不变,改变判断方法即可。

 function checkIp($ip, $rule)
{
$rule_regexp = str_replace('.*', 'a', $rule);//将.*临时替换成别的符号(.和*都是正则中有特殊含义的符号)
$rule_regexp = preg_quote($rule_regexp, '/');//向规则字符串中增加转义,避免字符串中有其他特殊字符影响正则匹配,非必要语句本例可以忽略
$rule_regexp = str_replace('a','\.\d{1,3}', $rule_regexp);//将临时符号替换成正则表达式
if(preg_match('/^' . $rule_regexp . '$/', $ip)){
return 1;//匹配
}else{
return 0;//不匹配
}
} $arr = getWhiteIps('white_ips.conf');
$ip = '192.168.1.';
$allow = 0;
foreach ($arr as $rule) {
if(checkIp($ip, $rule)){
$allow = 1;//找到一个排配则标记白名单,然后结束循环
break;
}
}
echo $allow;

  这种有范围的验证,稍微复杂一点,需要逐一比对判断。利用正则匹配IP后,结束循环。

  

  

IP白名单的实现(PHP)的更多相关文章

  1. Windows Azure Web Site (14) Azure Web Site IP白名单

    <Windows Azure Platform 系列文章目录> 我们知道,在Azure Cloud Service和Virtual Machine,可以通过Endpoint ACL (Ac ...

  2. 利用CentOS系统IPtables防火墙添加网站IP白名单

    参考博文: 利用CentOS系统IPtables防火墙添加360网站卫士节点IP白名单 centos6.5添加白名单如下: 在防火墙 配置文件中加入白名单  ip -A INPUT -s 183.13 ...

  3. 解决微信公众平台IP白名单

    微信公众平台,作为自媒体的旗舰级产品,越来越多的人已经投入它的怀抱.正如它的广告词所说:再小的个体,也有品牌 好吧,闲话不多说,今天要说的是它的IP白名单机制. 我们现在安装的大部分的电信的家庭级别的 ...

  4. 微信公众平台宣布增加接口IP白名单提高安全性

    微信公众平台目前已经发布通知在平台接口调用上为了提高安全性需要添加IP白名单并仅允许白名单IP调用. 目前微信公众平台面向开发者主要提供的开发者ID和开发者密钥,在调用时ID和密钥通过检验即可进行调用 ...

  5. 如何为ASP.NET Core设置客户端IP白名单验证

    原文链接:Client IP safelist for ASP.NET Core 作者:Damien Bowden and Tom Dykstra 译者:Lamond Lu 本篇博文中展示了如何在AS ...

  6. 算法题:实现一个IP白名单过滤器

        最近看到一则招聘的JD,附了一个算法题的链接,原题如下: 请实现一个IP白名单过滤算法,实现以下接口 boolean addWhiteIpAddress(String ip); boolean ...

  7. IP白名单

    一.什么是IP白名单 公众平台后台新增了IP白名单功能.通过开发者ID及密码调用获取access_token接口时,需要设置访问来源IP为白名单. IP白名单是指一组IP列表,只有该列表中的IP地址的 ...

  8. IP白名单添加了当前IP,获取access_token时依然报出错误码40164的坑

    开发公众号网页时,想要调用微信API接口,令人无奈的是,想要调用各接口都需使用access_token,于是,获取access_token的征途开始了…… 1.开发者基本配置 (1) 公众平台官网登录 ...

  9. 对actuator的管理端点进行ip白名单限制(springBoot添加filter)

    在我们的SpringCloud应用中,我们会引入actuator来进行管理和监控我们的应用 常见的有:http://www.cnblogs.com/yangzhilong/p/8378152.html ...

随机推荐

  1. Ext Js 6.2.1 classic grid 滚动条bug解决方案

    此bug未在其他版本发现,参考高版本代码重写类解决此bug,直接上代码: /** * 如果列表同时存在横向滚动条和竖向滚动条,当竖向滚动条滚动到底部时 * 点击横向滚动条,滚动条会自动滚动到顶部 * ...

  2. 深度学习入门之Mnist

    参看Deep learning from scratch,学习到反向传播网络后,把网络调通了,但是训练后损失函数减小,准确率没有变化,和瞎猜一样,是为什么呢?只有在看看各层缺少什么,关键是我的参数和书 ...

  3. 28、gulp

    一.gulp的作用? 1.gulp-sass : 编译sass 2.gulp-rename : 重命名 3.gulp-cssnano : 压缩css 4.gulp-concat : 合并文件 5.gu ...

  4. python全栈开发 * 14 知识点汇总 * 180530

    14 生成器表达式 内置函数# 一.迭代器 (补充)# 1.如何判断迭代对象,迭代器# (1).dir(obj)检测对象有没有iter方法,然后it=obj.__iter__() 获取迭代器 , it ...

  5. Git忽略提交规则 - .gitignore配置运维总结

    在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交.简单来说一个场景:在你使用git add .的时候,遇到 ...

  6. SqlHelper2

    public abstract class DBHelper { public static string connectionString = @"DATA SOURCE=.\sqldat ...

  7. TypeError: object() takes no parameters

    1.定义了类,在类中实现函数功能,但是需要传参数,我在类中没有建立__init__(self,) 导致没法传参.

  8. mysql新建数据库、新建用户及授权操作

    1.创建数据库create database if not exists test176 default charset utf8 collate utf8_general_ci; #utf8_gen ...

  9. winform做的excel与数据库的导入导出

    闲来无事,就来做一个常用的demo,也方便以后查阅 先看效果图 中间遇到的主要问题是获取当前连接下的所有的数据库以及数据库下所有的表 在网上查了查,找到如下的方法 首先是要先建立一个连接 _connM ...

  10. JAVA:IDEA使用Junit(3)

    1.配置 File ——> Project Structure ——> Libraries ——> + ——>搜索Junit类库 确认ok即可 2.编辑项目 选择创建 配置生成 ...