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

2015-01-24信息快讯网

网络环境异常复杂,有时候我们不得不禁止一些恶意用户访问,禁止的方式有很多种,其中一种就是通过 IP 来限制,本文提供的方法允许你通过 IP 区间、CIDR (Classless Inter-Domain Routing)及单个 IP 格式来检查或过滤 IP 地址

你可以通过增加一个配置文件,然后将需要禁止的一些 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 register_shutdown_function函数的深入解析
深入PHP与浏览器缓存的分析
PHP判断图片格式的七种方法小结
PHP批量采集下载美女图片的实现代码
基于PHP CURL获取邮箱地址的详解
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
如何批量替换相对地址为绝对地址(利用bat批处理实现)
PHP 处理TXT文件(打开/关闭/检查/读取)
php gzip压缩输出的实现方法
Eclipse中php插件安装及Xdebug配置的使用详解
php简单开启gzip压缩方法(zlib.output_compression)
php获取用户IPv4或IPv6地址的代码
屏蔽机器人从你的网站搜取email地址的php代码
php中检查文件或目录是否存在的代码小结
检查php文件中是否含有bom的函数
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
phpMyAdmin出现无法载入 mcrypt 扩展,请检查PHP配置的解决方法
PHP的array_diff()函数在处理大数组时的效率问题
PHP中usort在值相同时改变原始位置问题的解决方法
PHP中strtotime函数使用方法详解
遍历指定目录下的所有目录和文件的php代码
用PHP写的基于Memcache的Queue实现代码
PHP中去除换行解决办法小结(PHP_EOL)
PHP提取字符串中的图片地址[正则表达式]
php empty() 检查一个变量是否为空
php数组函数序列之array_flip() 将数组键名与值对调
PHP获取MAC地址的函数代码
PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
php中获取远程客户端的真实ip地址的方法
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
PHP 数据结构 算法 三元组 Triplet
php中获取指定IP的物理地址的代码(正则表达式)
php下通过IP获取地理位置的代码(小偷程序)
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
©2014-2024 dbsqp.com