PHP 中检查或过滤IP地址的实现代码
前端之家收集整理的这篇文章主要介绍了
PHP 中检查或过滤IP地址的实现代码,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
你可以通过增加一个配置文件,然后将需要禁止的一些 IP 地址通过一定规则添加到配置文件中,在程序初始化的时候,读取配置文件中的每个规则,然后通过本文提供的方法去检查当前访问的客户端 IP 地址是否存在于这些规则中,如果存在,则拒绝提供服务。
<div class="codetitle"><a style="CURSOR: pointer" data="61266" class="copybut" id="copybut61266" onclick="doCopy('code61266')"> 代码如下:
<div class="codebody" id="code61266">
<?
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,$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
?>