检测ip地址库内是否存在指定的ip

检测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;
    }

猜你喜欢

转载自blog.csdn.net/tdcqfyl/article/details/81325245