PHP 中检查或过滤IP地址的实现代码


Posted in PHP onNovember 27, 2011

你可以通过增加一个配置文件,然后将需要禁止的一些 IP 地址通过一定规则添加到配置文件中,在程序初始化的时候,读取配置文件中的每个规则,然后通过本文提供的方法去检查当前访问的客户端 IP 地址是否存在于这些规则中,如果存在,则拒绝提供服务。

<?php 
/** 
* PHP 中检查或过滤 IP 地址 
* 
* 支持 IP 区间、CIDR(Classless Inter-Domain Routing)及单个 IP 格式 
* 整理:http://www.CodeBit.cn 
* 参考: 
* - {@link http://us2.php.net/manual/zh/function.ip2long.php#70055} 
* - {@link http://us2.php.net/manual/zh/function.ip2long.php#82397} 
* 
* @param string $network 网段,支持 IP 区间、CIDR及单个 IP 格式 
* @param string $ip 要检查的 IP 地址 
* @return boolean 
*/ 
function netMatch($network, $ip) { 
$network = trim($network); 
$ip = trim($ip); 
$result = false; 
// IP range : 174.129.0.0 - 174.129.255.255 
if (false !== ($pos = strpos($network, "-"))) { 
$from = ip2long(trim(substr($network, 0, $pos))); 
$to = ip2long(trim(substr($network, $pos+1))); 
$ip = ip2long($ip); 
$result = ($ip >= $from and $ip <= $to); 
// CIDR : 174.129.0.0/16 
} else if (false !== strpos($network,"/")) { 
list ($net, $mask) = explode ('/', $network); 
$result = (ip2long($ip) & ~((1 << (32 - $mask)) - 1)) == ip2long($net); 
// single IP 
} else { 
$result = $network === $ip; 
} 
return $result; 
} 
// 174.129.0.0 - 174.129.255.255 
var_dump(netMatch(' 174.129.0.0 - 174.129.255.255 ', '174.129.1.31')); // True 
var_dump(netMatch(' 174.129.0.0/16 ', '174.139.1.31')); // False 
var_dump(netMatch(' 174.129.1.32 ', '174.129.1.31')); // False 
?>

由于中国使用的大多数都是动态 IP 地址,所以通过 IP 地址限制访问具有一定的局限性,使用的时候需要谨慎,但是对于应急限制访问来说,还是非常有用的。
PHP 相关文章推荐
基于mysql的bbs设计(一)
Oct 09 PHP
解决php中Cannot send session cache limiter 的问题的方法
Apr 27 PHP
php 注释规范
Mar 29 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
Jul 03 PHP
destoon官方标签大全
Jun 20 PHP
php实现建立多层级目录的方法
Jul 19 PHP
linux下编译安装memcached服务
Aug 03 PHP
php中file_exists函数使用详解
May 08 PHP
PHP扩展Memcache分布式部署方案
Dec 06 PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
Feb 19 PHP
thinkphp框架page类与bootstrap分页(美化)
Jun 25 PHP
Laravel统计一段时间间隔的数据方法
Oct 09 PHP
PHP中usort在值相同时改变原始位置问题的解决方法
Nov 27 #PHP
PHP中strtotime函数使用方法详解
Nov 27 #PHP
遍历指定目录下的所有目录和文件的php代码
Nov 27 #PHP
用PHP写的基于Memcache的Queue实现代码
Nov 27 #PHP
PHP中去除换行解决办法小结(PHP_EOL)
Nov 27 #PHP
php操作SVN版本服务器类代码
Nov 27 #PHP
支持中文的php加密解密类代码
Nov 27 #PHP
You might like
深入PHP FTP类的详解
2013/06/13 PHP
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
php中getservbyport与getservbyname函数用法实例
2014/11/18 PHP
PHP读取zip文件的方法示例
2016/11/17 PHP
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
多浏览器支持的右下角浮动窗口
2010/04/01 Javascript
jQuery源码分析-04 选择器-Sizzle-工作原理分析
2011/11/14 Javascript
深入理解JavaScript系列(12) 变量对象(Variable Object)
2012/01/16 Javascript
JavaScript中for..in循环陷阱介绍
2013/11/12 Javascript
javascript获取dom的下一个节点方法
2014/09/05 Javascript
Thinkphp模板没有解析直接原样输出的解决方法
2014/10/31 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
2016/01/07 Javascript
jQuery取消特定的click事件
2016/02/29 Javascript
JS 实现可停顿的垂直滚动实例代码
2016/11/23 Javascript
JS类的定义与使用方法深入探索
2016/11/26 Javascript
Bootstrap基本插件学习笔记之折叠(22)
2016/12/08 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
2017/01/13 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
Vue-Router2.X多种路由实现方式总结
2018/02/09 Javascript
Vue项目查看当前使用的elementUI版本的方法
2018/09/27 Javascript
[44:39]2014 DOTA2国际邀请赛中国区预选赛 NE VS CNB
2014/05/21 DOTA
[46:00]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第一局
2016/03/03 DOTA
Django的HttpRequest和HttpResponse对象详解
2018/01/26 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
css3.0 图形构成实例练习一
2013/03/19 HTML / CSS
微软英国官方网站:Microsoft英国
2016/10/15 全球购物
心理学专业毕业生推荐信范文
2013/11/21 职场文书
搬家公司的创业计划书
2014/01/01 职场文书
车队司机自我鉴定
2014/03/02 职场文书
《蜗牛的奖杯》教后反思
2014/04/24 职场文书
个人遵守党的政治纪律情况对照检查材料思想汇报
2014/09/25 职场文书
酒店人事专员岗位职责
2015/04/07 职场文书
教学督导岗位职责
2015/04/10 职场文书
2015年学校团委工作总结
2015/05/26 职场文书
同学聚会祝酒词
2015/08/10 职场文书