检测ip地址库内是否存在指定的ip,支持精确匹配、尾部*号匹配及ip区间匹配。
应用场景:ip 白名单 / 黑名单、系统后台限制内网访问等。
/**
* 检测ip地址库内是否存在指定的ip,支持精确匹配、尾部*号匹配及ip区间匹配
* @param string $ip 待检测的ip字符串
* @param array $ipList ip数组列表,该参数为空时,忽略检测
* @return bool true 地址库为空 或 地址库内存在指定的ip | false 地址库内不存在指定的ip
*/
public function filterIP($ip,$ipList=array()) {
if (!$ipList) {
return true;
}
// 优先精确匹配
if (in_array($ip,$ipList)) {
return true;
}
$ip_tmp = explode('.',$ip);
$ip_tmp_pad = $ip_tmp;
array_walk($ip_tmp_pad,function(&$value,$key){
$value = str_pad(strval($value), 3, '0', STR_PAD_LEFT);
});
$ip_tmp_long = implode('',$ip_tmp_pad);
// ip段区间匹配
foreach ($ipList as $ipItem) {
if (strpos($ipItem,'-') === false) {
continue;
}
$ip_item_tmp = explode('-',$ipItem);
// 起始ip
$ip_start = trim($ip_item_tmp[0]);
$ip_start_arr = explode('.',$ip_start);
array_walk($ip_start_arr,function(&$value,$key){
$value = str_pad(strval($value), 3, '0', STR_PAD_LEFT);
});
$ip_start = implode('',$ip_start_arr);
// 截止ip
$ip_end = trim($ip_item_tmp[1]);
$ip_end_arr = explode('.',$ip_end);
array_walk($ip_end_arr,function(&$value,$key){
$value = str_pad(strval($value), 3, '0', STR_PAD_LEFT);
});
$ip_end = implode('',$ip_end_arr);
if ($ip_tmp_long >= $ip_start && $ip_tmp_long <= $ip_end) {
return true;
}
}
// 模糊匹配处理
$flag = false;
foreach ($ipList as $ipItem) {
$ip_item_tmp = explode('.',$ipItem);
if ($ip_item_tmp[0] == '*') {
$flag = true;
break;
}
// ip第1段
if ($ip_item_tmp[0] == $ip_tmp[0] && $ip_item_tmp[1] == '*') {
$flag = true;
break;
}
// ip第2段
if ($ip_item_tmp[0] == $ip_tmp[0] && $ip_item_tmp[1] == $ip_tmp[1] && $ip_item_tmp[2] == '*') {
$flag = true;
break;
}
// ip第3段
if ($ip_item_tmp[0] == $ip_tmp[0] && $ip_item_tmp[1] == $ip_tmp[1] && $ip_item_tmp[2] == $ip_tmp[2] && $ip_item_tmp[3] == '*') {
$flag = true;
break;
}
// ip第4段
if ($ip_item_tmp[0] == $ip_tmp[0] && $ip_item_tmp[1] == $ip_tmp[1] && $ip_item_tmp[2] == $ip_tmp[2] && $ip_item_tmp[3] == $ip_tmp[3]) {
$flag = true;
break;
}
}
return $flag;
}