knife4j生产环境资源屏蔽

news2024/9/20 16:41:56

问题描述

knife4j是目前比较主流的自动API文档生成工具,在生产环境使用的过程中,我们一般会屏蔽或者去除Swagger的文档口径,防止接口信息泄露,保证系统安全。
但是最近在开发过程中使用knife4j-spring-boot-starter 3.0.2过程中,发现根据官网说明配置后,还是有部分Swagger的文档口径无法完全屏蔽。

项目背景spring-boot-starter-parent 2.2.6.RELEASE + knife4j-spring-boot-starter 3.0.2

<dependency>
     <groupId>com.github.xiaoymin</groupId>
     <artifactId>knife4j-spring-boot-starter</artifactId>
     <version>3.0.2</version>
 </dependency>

属性配置

# knife4j的增强配置
knife4j.enable=true
# 开启生产环境屏蔽,一定要先开启knife4j增强才会生效
knife4j.production=true

访问http://localhost:8080/doc.html,资源已被屏蔽:
在这里插入图片描述
访问/v2/api-docs地址,资源已经被屏蔽:
在这里插入图片描述

访问/v3/api-docs地址,资源未屏蔽:
在这里插入图片描述

问题小结:
在使用knife4j-spring-boot-starter 3.0.2 + openApi3.0时,通过配置knife4j.enable=true和knife4j.production=true属性,虽然屏蔽了部分Swagger的文档口径,但/v3/api-docs口径并没有被屏蔽,还是有接口信息泄露的风险。


原因分析:

官方文档:knife4j访问权限控制-生产环境屏蔽资源

首先通过查看官方文档,我们发现在需要屏蔽的资源中确实没有包含/v3/api-docs口径。
在这里插入图片描述

继续通过源码分析,在Knife4jAutoConfiguration类中,knife4j.production=true控制是否实例化ProductionSecurityFilter对象:

@Bean
    @ConditionalOnMissingBean({ProductionSecurityFilter.class})
    @ConditionalOnProperty(
        name = {"knife4j.production"},
        havingValue = "true"
    )
    public ProductionSecurityFilter productionSecurityFilter(Knife4jProperties knife4jProperties) {
        boolean prod = false;
        ProductionSecurityFilter p = null;
        if (knife4jProperties == null) {
            if (this.environment != null) {
                String prodStr = this.environment.getProperty("knife4j.production");
                if (this.logger.isDebugEnabled()) {
                    this.logger.debug("swagger.production:{}", prodStr);
                }

                prod = Boolean.valueOf(prodStr);
            }

            p = new ProductionSecurityFilter(prod);
        } else {
            p = new ProductionSecurityFilter(knife4jProperties.isProduction());
        }

        return p;
    }

而ProductionSecurityFilter继承自BasicFilter:

public class BasicFilter {
    private Logger logger = LoggerFactory.getLogger(BasicFilter.class);
    protected List<Pattern> urlFilters = null;

     //需要屏蔽的资源
    public BasicFilter() {
        this.urlFilters = new ArrayList();
        this.urlFilters.add(Pattern.compile(".*?/doc\\.html.*", 2));
        this.urlFilters.add(Pattern.compile(".*?/v2/api-docs.*", 2));
        this.urlFilters.add(Pattern.compile(".*?/v2/api-docs-ext.*", 2));
        this.urlFilters.add(Pattern.compile(".*?/swagger-resources.*", 2));
        this.urlFilters.add(Pattern.compile(".*?/swagger-ui\\.html.*", 2));
        this.urlFilters.add(Pattern.compile(".*?/swagger-resources/configuration/ui.*", 2));
        this.urlFilters.add(Pattern.compile(".*?/swagger-resources/configuration/security.*", 2));
    }

    //路径匹配
    protected boolean match(String uri) {
        boolean match = false;
        if (uri != null) {
            Iterator var3 = this.getUrlFilters().iterator();

            while(var3.hasNext()) {
                Pattern pattern = (Pattern)var3.next();
                if (pattern.matcher(uri).matches()) {
                    match = true;
                    break;
                }
            }
        }
        return match;
    }

可以发现在knife4j-spring-boot-starter 3.0.2 版本中,BasicFilter屏蔽的资源中并不包括/v3/api-docs资源口径,这也就导致knife4j.production=true属性不能屏蔽/v3/api-docs资源口径。


解决方案:

方式一:自定义ProductionSecurityFilter

上文我们已经分析出没有屏蔽/v3/api-docs资源口径的原因是ProductionSecurityFilter对象的父类BasicFilter屏蔽的资源列表中缺少/v3/api-docs资源口径,首先想到的是是否能通过自定义ProductionSecurityFilter对象来手动添加/v3/api-docs资源口径,实现资源屏蔽。

在项目的Knife4j的配置类Knife4jConfig中添加如下代码:

     @Bean
    @ConditionalOnProperty(
            name = {"knife4j.production"},
            havingValue = "true"
    )
    public ProductionSecurityFilter productionSecurityFilter(Knife4jProperties knife4jProperties) {
        boolean prod = false;
        ProductionSecurityFilter p = null;
        if (knife4jProperties == null) {
            if (this.environment != null) {
                String prodStr = this.environment.getProperty("knife4j.production");
                log.debug("swagger.production:{}", prodStr);
                prod = Boolean.valueOf(prodStr);
            }
            p = new MyProductionSecurityFilter(prod);
        } else {
            p = new MyProductionSecurityFilter(knife4jProperties.isProduction());
        }

        return p;
    }

    //自定义ProductionSecurityFilter,添加`/v3/api-docs`资源口径
    public static class MyProductionSecurityFilter extends ProductionSecurityFilter{
        public MyProductionSecurityFilter(boolean production) {
            super(production);
            super.urlFilters.add(Pattern.compile(".*?/v3/api-docs.*", 2));
        }
    }

方式二:升级knife4j版本到3.0.3

将knife4j-spring-boot-starter升级到最新的版本3.0.3

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>

该版本中BasicFilter屏蔽资源列表中已经包含/v3/api-docs资源口径:
在这里插入图片描述

方式三:禁用springfox自动配置

因为knife4j底层是依赖的springfox,也可以通过禁用springfox来屏蔽资源。
在这里插入图片描述
属性配置:

#禁用springfox
springfox.documentation.enabled=false
# 如果禁用springfox,则不能开启knife4j增强,否则项目启动会报错
knife4j.enable=false

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/536564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

dolphinscheduler使用impala shell执行sql

目录 一、背景 二、方法 1.impala shell -f 文件名 2.impala shell -q sql 一、背景 因为dolphinscheduler工具sql组件不支持impala数据源&#xff0c;只能折衷方法通过shell来执行impala sql。 二、方法 1.impala shell -f 文件名 操作步骤&#xff1a; 1).【资源中心】…

受邀参加【第七届】中国客户服务节

在AI浪潮的推动下&#xff0c;客户服务“智能化”是企业高质量发展的重要途径之一&#xff0c;目前人工智能、大数据、云计算等技术已广泛应用于全行业的客户服务场景中&#xff0c;一个全面、完善、稳定的智能通讯服务平台可助力实现企业智能化应用转型和升级。 讯鸿网络作为国…

嘉立创EDA原理图封装画错了怎么办

摘要&#xff1a;本文以贴片电阻封装由1206修改为0805为例&#xff0c;介绍一下封装修改的一种方法。 1.问题描述 设计原理图的时候&#xff0c;误将封装设计成为1206了&#xff0c;现在想把它改为0805封装。 2.修改封装的步骤 首先在原理图中&#xff0c;修改对应的电阻器件…

Flutter 3.10 适配之单例 Window 弃用,一起来了解 View.of 和 PlatformDispatcher

Flutter 3.10 发布之后&#xff0c;大家可能注意到&#xff0c;在它的 release note 里提了一句&#xff1a; Window singleton 相关将被弃用&#xff0c;并且这个改动是为了支持未来多窗口的相关实现。 所以这是一个为了支持多窗口的相关改进&#xff0c;多窗口更多是在 PC 场…

统计学习方法:序贯概率比检验SPRT

Sequential Probability Ratio Test 应用&#xff1a;制造过程中的质量控制和医学试验中的异常检测 1.theory/principal 区别(vs固定样本检验)&#xff1a;在固定样本检验中&#xff0c;一定数量的观察结果被用来从两个或多个备选方案中选择一个假设。而SPRT则是一次检查一个…

AI“应用商店”来了!OpenAI首批70个ChatGPT Plugin最全梳理

OpenAI放出大招&#xff0c;本周将向所有ChatGPT Plus用户开放联网功能和众多插件本周将向所有ChatGPT Plus用户开放联网功能和众多插件&#xff0c;允许ChatGPT访问互联网并使用70个第三方插件。 本批第三方插件能够全方位覆盖衣食住行、社交、工作以及学习等日常所需&#x…

Electron自定义窗口

Electron标题栏隐藏和自定义 Electron应用自定义标题栏样式 标题栏样式允许隐藏浏览器窗口的大部分色彩&#xff0c;同时保持系统原生窗口控件完整无损&#xff0c;并可以在 BrowserWindow 的构造器中使用 titleBarStyle 选项来配置。 应用 hidden 标题栏样式的结果是隐藏标…

无线充+台灯专用PD诱骗芯片LDR6328S

近几年&#xff0c;日常生活中到处可以看到消费者使用支持Type-c接口的电子产品&#xff0c;如手机&#xff0c;笔记本&#xff0c;筋膜枪&#xff0c;蓝牙音箱等等。例如&#xff0c;像筋膜枪&#xff0c;蓝牙音箱&#xff0c;无人机&#xff0c;小风扇。 无线充台灯方案&…

librosa语音信号处理

librosa是一个非常强大的python语音信号处理的第三方库&#xff0c;本文参考的是librosa的官方文档&#xff0c;本文主要总结了一些重要&#xff0c;对我来说非常常用的功能。学会librosa后再也不用python去实现那些复杂的算法了&#xff0c;只需要一句语句就能轻松实现。 先总…

数字化时代,初创公司如何建设业财一体化

业财一体的关键是构建“业务活动跟财务活动之间的线上化链接”&#xff0c;财务可以通过线上支撑业务&#xff0c;业务活动数据可以通过线上高时效触达财务&#xff1b;从业务数据到财务数据&#xff0c;除了需要运营系统的支撑还需要会计引擎的实现&#xff0c;会计引擎将业务…

优秀的开发者,如何借助免费低代码平台实现数据采集?

采集和管理数据&#xff0c; 从未如此简单自然 一款免费的零代码产品‘敲敲云’&#xff0c;可以帮助每个人轻松创建表单&#xff0c;自由收集问卷样本、活动参与者名单、客户数据&#xff0c;原本几天的工作在 1 个小时内轻松搞定。 表单编辑器&#xff0c;让你和数据专家一样…

分享5款高效率软件,免费无广告

人类与99%的动物之间最大差别在于是否会运用工具&#xff0c;借助好的工具&#xff0c;能提升几倍的工作效率。 1.多设备键鼠共享——Synergy Synergy让你可以轻松地在办公桌上多台计算机之间共享你的鼠标和键盘。你只要将鼠标&#xff08;指针&#xff09;从一台计算机的屏幕…

用小程序技术服务数字城市

“十四五”规划大纲明确指出&#xff0c;要迎接数字时代&#xff0c;激活数据要素潜力&#xff0c;加快建设网络强国&#xff0c;加快建设数字经济、数码社会和数码政府&#xff0c;以数字化转型为变革的方式改变生产方式、生活方式和治理。 数字城市的技术内涵 数字城市的发…

轨道交通信号安全完整性等级(SIL)

轨道交通行业中&#xff0c;对于信号系统、车辆子系统等安全相关的系统有安全完整性&#xff08;SIL&#xff09;等级的要求&#xff0c;需要进行通用产品层安全评估和工程特定应用项目安全评估&#xff0c;已经形成了行业共识。对于初次了解SIL的人&#xff0c;在实际应用中存…

一文告诉你:为什么小程序更安全

随着数字时代的到来&#xff0c;数据不再是普通的符号和徽标&#xff0c;也不仅仅是普通的计算和统计工具。而安全问题也已经成为了一个非常重要的议题。今天就来探讨下小程序的安全架构&#xff0c;以了解小程序如何做到安全保障。 小程序的安全架构 先说说小程序自身的安全架…

【C++】YY带你手把手掌握C++系列 (P2)未完结

前言 大家好&#xff0c;这里是YY的带你手把手掌握C系列。大部分知识点都含有【特性介绍】【使用场景】【注意要点】【易混淆点】【代码演示】【画图演示】由于C体系之庞大&#xff0c;所以该系列以分P形式更新&#xff01;本篇博客为P2&#xff01; 大家可以通过本篇博客查找C…

【jmeter】同一线程组下多个请求分别执行不同次数

今天介绍下JMeter如何控制请求执行次数 主要有两种方式&#xff1a; 方式一&#xff1a;通过循环控制器控制每个请求的执行次数 例如&#xff1a;脚本执行规律是这样的&#xff0c;login-->customerPage-->search 我想执行一遍login&#xff0c;然后运行3遍customerP…

智能的本质人工智能与机器人领域的64个大问题阅读笔记(3)

目录 哥德尔不完备定理是什么&#xff1f; 文件重命名的快捷键 第一个质疑这类言论的哲学家是休伯特德雷福斯 (HubertDreyfus)&#xff0c;他在《Alchemy and Artifcial Intelligence》(1965)一书中写道:“人工智能的长足发展......必须有待于全新计算机的问世。现有的计算机…

数据结构-算法时间复杂度

1.算法的时间复杂度取决于一段程序中基本运算的频度 2.基础规则 1.加法&#xff1a;O(n) O(max(F(n),G(n)) 2.乘法&#xff1a;O(n) O&#xff08;F(n)*G(n)&#xff09; 3.取基本运算中n增长最快的项&#xff1a;F(n) anbncn 时间复杂度为O(n) 3. 例子 接下来举几个例子…

chatgpt与其他行业的结合

chatgpt的应用场景非常广泛&#xff0c;其中一些主要应用场景包括以下几个方面&#xff1a; 1. 自然语言处理&#xff1a;chatgpt作为一种强大的机器学习算法&#xff0c;在自然语言处理领域得到了广泛应用。例如&#xff0c;它可以用来完成机器翻译、情感分析、文本分类等任务…