PHP 中检查或过滤IP地址的实现代码
程序员文章站
2022-07-07 08:14:51
你可以通过增加一个配置文件,然后将需要禁止的一些 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
/**
* 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 地址限制访问具有一定的局限性,使用的时候需要谨慎,但是对于应急限制访问来说,还是非常有用的。
上一篇: C#版的 Escape() 和 Unescape()
下一篇: day4