Swagger API 未授权访问漏洞【原理扫描】修复
一、背景
漏洞名称:Swagger API 未授权访问漏洞【原理扫描】
风险等级:中
详细描述:
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务,方便开发者快速了解和调试接口。但由于其文档默认公开在 Web 路径下,未经授权的用户也能访问,从而可能泄露接口信息,甚至造成未授权访问、任意文件读取等安全风险。
参考链接: https://www.sec-in.com/article/476
解决办法:
- 在生产环境中禁用 Swagger。
- 配置 Spring Security/Shiro 权限控制,限制 Swagger UI 相关 URL 的访问。
- 使用 nginx 或过滤器对相关接口进行访问控制。
二、问题分析与复现
部署的微服务项目中,访问 http://ip:port/swagger-resources
时,可以直接获取所有服务的 Swagger 接口信息。这说明接口文档未做访问权限控制,Swagger 相关接口在生产环境依然暴露,存在严重安全隐患。
项目架构使用了 spring-cloud-gateway
聚合多个微服务的 Swagger 接口,同时也集成了 swagger2(2.9.2)
和 knife4j(2.0.9)
。默认配置下,以下路径均可被外部访问:
/swagger-ui.html
/swagger-resources
/v2/api-docs
/doc.html
三、尝试过的禁用方法(未成功)
方法 1:使用 @Profile({"dev","test"})
注解
这种方式理论上可以控制 Swagger 配置类仅在开发或测试环境启用,但项目中 Swagger 路由配置是通过 RouterFunction
实现的,不是常规的 Docket
Bean 配置,导致 @Profile
注解未能控制实际路由注册,所以是无效滴。
方法 2:使用 @ConditionalOnProperty
通过设置:
@ConditionalOnProperty(name = "swagger.enable", havingValue = "true")
配合配置文件启用:
swagger:enable: true
该控制同样只适用于基于 Docket
的 Swagger 配置类,无法影响 RouterFunction
中对 Swagger 接口的路由注册,所以这种方式还是无效滴。
方法 3:自定义权限拦截 Swagger 接口路径
尝试使用 Spring Security 拦截 /swagger-ui.html
和 /v2/api-docs
等路径,由于网关层的路由是通过 RouterFunction
注册的,绕过了 Spring Security 的传统 filter 链,权限控制并未生效,还是没解决 …
@Override
protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/swagger-ui.html", "/swagger-resources/**", "/v2/api-docs").hasRole("ADMIN").anyRequest().authenticated();
}
四、最终解决方案
结合实际架构,最终采用了配置开关 + 路由控制的方式。
修改 RouterFunctionConfiguration
代码
@Slf4j
@Configuration
@RequiredArgsConstructor
public class RouterFunctionConfiguration {private final ImageCodeCheckHandler imageCodeCheckHandler;private final ImageCodeCreateHandler imageCodeCreateHandler;private final SwaggerResourceHandler swaggerResourceHandler;private final SwaggerSecurityHandler swaggerSecurityHandler;private final SwaggerUiHandler swaggerUiHandler;@Value("${swagger.use-flag:false}")private boolean useFlag;@Beanpublic RouterFunction<ServerResponse> routerFunction() {RouterFunctions.Builder routerBuilder = RouterFunctions.route().route(RequestPredicates.path("/xxx/xxx").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),imageCodeCreateHandler).andRoute(RequestPredicates.POST("/xxx/xxx").and(RequestPredicates.accept(MediaType.ALL)),imageCodeCheckHandler);if (useFlag) {routerBuilder.andRoute(RequestPredicates.GET("/swagger-resources").and(RequestPredicates.accept(MediaType.ALL)),swaggerResourceHandler).andRoute(RequestPredicates.GET("/swagger-resources/configuration/ui").and(RequestPredicates.accept(MediaType.ALL)),swaggerUiHandler).andRoute(RequestPredicates.GET("/swagger-resources/configuration/security").and(RequestPredicates.accept(MediaType.ALL)),swaggerSecurityHandler);}return routerBuilder.build();}
}
配置文件 application-xxx.yml
(使用的是 nacos 配置中心)
knife4j:# 开启增强配置enable: false# 启用生产环境屏蔽production: trueswagger:use-flag: falsetitle: EmpX Swagger API# .....
其中:
knife4j.enable: false
禁用 Knife4j 前端增强功能knife4j.production: true
屏蔽生产环境访问swagger.use-flag: false
控制是否注册 Swagger 路由
验证:
gateway 项目部署后,访问以下路径均返回 404,Swagger 接口已彻底关闭:
/swagger-ui.html
/swagger-resources
/v2/api-docs
/doc.html
所以还是要根据实际的项目架构来调整,不一定是提供的方法不好用,可能是没用对或者根本就不适用…
相关文章:
Swagger API 未授权访问漏洞【原理扫描】修复
一、背景 漏洞名称:Swagger API 未授权访问漏洞【原理扫描】 风险等级:中 详细描述: Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务,方便开发者快速了解和调试接口。但由于…...

深度“求索”:DeepSeek+Dify构建个人知识库
目录 前言 环境部署 安装Docker 安装Dify 配置Dify 部署知识库 创建应用 前言 在当今数字化信息爆炸的时代,数据隐私和个性化知识管理成为企业和个人关注的焦点。Dify,作为一款备受瞩目的开源 AI 应用开发平台,为用户提供了完整的私有…...

基于R语言的空间异质性数据分析技术
在自然和社会科学领域,存在大量与地理或空间相关的数据,这些数据通常具有显著的空间异质性。传统的统计学方法在处理这类数据时往往力不从心。基于R语言的一系列空间异质性数据分析方法,如地理加权回归(GWR)、地理加权…...
C++:动态刷新打印内容
目录 1.简介1.1 Display类原理简述 2.代码2.1 main.cpp:无注释版2.2 main.cpp:有注释版 3.编译运行 1.简介 本文介绍一个用于命令行动态覆盖输出的C实现(Display类); 效果说明: 普通输出会直接换行显示。…...

网络学习-TCP协议(七)
一、TCP协议 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 1、三次握手 客户端: 1、先发起连接,发送SYN置1,seqnum12345(随机值)----半连接…...

基于微信小程序的高校校园微活动管理系统设计与实现(源码+定制+开发)高校微信小程序校园活动发布与互动平台开发 面向大学生群体的校园活动移动平台设计与实现
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...
Python 项目中安装 OpenAI 库的详细指南
在 Windows 系统中指定版本安装 OpenAI 库的指南 在 Windows 系统中,尤其是使用 Python 3.7.8 时,安装 OpenAI 库可能会遇到一些问题。本文将为你提供一个简单易懂的解决方案,帮助你成功安装指定版本的 OpenAI 库。 一、问题背景 当你在 W…...

云计算与大数据进阶 | 27、存储系统如何突破容量天花板?可扩展架构的核心技术与实践—— 分布式、弹性扩展、高可用的底层逻辑(上)
数据中心里,存储系统是至关重要的组成部分。由于相关硬件组件与存储操作系统的多样性和复杂性,如何在保证存储稳定、安全、可靠的同时,实现灵活扩展和自服务,一直是困扰数据中心全面云化的难题。 简单来说,现在的难题…...
使用Gemini, LangChain, Gradio打造一个书籍推荐系统 (第二部分)
建立向量嵌入数据库 from langchain_community.document_loaders import TextLoader from langchain_text_splitters import CharacterTextSplitter from langchain.docstore.document import Document from langchain_chroma.vectorstores import Chromaimport vertexai from…...

IvorySQL-WASM:免安装的数据库探索之旅
简介 为了降低社区用户的使用门槛,提升使用体验,IvorySQL 社区特别推出了 IvorySQL-WASM 项目,帮助用户快速在线 Demo。 IvorySQL-WASM 基于开源的 Postgres-WASM 框架开发。它允许用户直接在网页浏览器中体验 IvorySQL,无需本地…...

飞牛fnNAS远程映射盘符
目录 一、NAS、PC端配置Zerotier 二、使用网上邻居 三、使用WebDAV 1.开启WebDAV 2.PC上安装RaiDrive并设置 如果能将NAS作为本机一个盘符来使用,一定会令我非常方便。如果是本地,可以很方便实现。 将飞牛NAS映射为本地盘符,常用两种方式,一种是网上邻居,另一种是We…...

Java设计模式:探索编程背后的哲学
设计模式是软件开发中的一种常见方法,它为常见问题提供了解决方案。在Java世界中,设计模式的应用尤为广泛。本文将深入探讨Java设计模式的起源、分类和实际应用,帮助读者更好地理解和应用这些模式。设计模式不仅是编程的技术,更是…...
会话管理有哪些
使用服务器或者框架的会话管理控制。应用程序应当只识别有效的会话标识符。 会话标识符必须总是在一个可信系统(比如:服务器)上创建。 会话管理控制应当使用通过审查的算法以保证足够的随机会话标识符。 为包含已验证的会…...
《C++20新特性全解析:模块、协程与概念(Concepts)》
引言:C20——现代C的里程碑 C20是继C11之后最具革命性的版本,它通过模块(Modules)、协程(Coroutines)和概念(Concepts)三大核心特性,彻底改变了C的代码组织方式、并发模…...

Docker部署OpenSearch集群
OpenSearch 简介 OpenSearch 是一款开源的搜索与分析引擎,最初由亚马逊 AWS 开发,于 2021 年 9 月将其移交至 Linux 基金会旗下的 OpenSearch 软件基金会,此后实现了社区主导的治理模式。其具有高性能、可扩展性强、兼容性强等优点ÿ…...
三宽用到的网络类型
用家宽、企宽和专线运行P2P的网络类型本质要求一致,但具体配置和优化方向因宽带类型而异。以下是关键差异与共性分析: 一、核心网络类型要求(三者的共性) 公网IP 必要性:均需公网IP(非内网IP)以…...

【AS32X601驱动系列教程】PLIC_中断应用详解
平台中断控制器(Platform Level Interrupt Controller,PLIC)是国科安芯AS32系列MCU芯片的中断控制器,主要对中断源进行采样,优先级仲裁和分发。各外设中断统一连到PLIC,PLIC统一管理并输出中断请求到内核。…...
单目视觉测量及双目视觉测量
一、单目视觉测量 1.1 原理部分讲解 单目视觉系统通过采集图像,将图像转换为二维数据,然后对采集的图像进行模式识别,通过图像匹配算法识别行驶过程中的车辆、行人、交通标志等,最后依据目标物体的运动模式和定位…...

python学习打卡day34
DAY 34 GPU训练及类的call方法 知识点回归: CPU性能的查看:看架构代际、核心数、线程数GPU性能的查看:看显存、看级别、看架构代际GPU训练的方法:数据和模型移动到GPU device上类的call方法:为什么定义前向传播时可以直…...
掩码与网关是什么?
1. 子网掩码(Subnet Mask) 作用:划分“小区”范围 想象你住在一个小区(子网)里: 小区门牌号 IP地址(如 192.168.1.10) 小区边界 子网掩码(如 255.255.255.0…...

leetcode-快慢指针系列
开胃小菜 141. 环形链表 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链…...

JAVA05基本数据类型和包装类的转换,转换成其他数据类型,包装类与字符串的转换+学生类的定义实例
1.基本数据类型和包装类的转换 下面是一个自动手动的例题 2.将包装类转换成其他类型 3. 将数据类型转换成字符串 将字符串转换成数据类型 以下是一个例题 学生类的例题...

Python打卡训练营学习记录Day34
知识点回归: CPU性能的查看:看架构代际、核心数、线程数 GPU性能的查看:看显存、看级别、看架构代际 GPU训练的方法:数据和模型移动到GPU device上 类的call方法:为什么定义前向传播时可以直接写作self.fc1(x) CPU性…...

动手学习深度学习V1.1 chapter2 (2.1-2.2)
chapter2:深度学习基础 区分问题:回归问题还是分类问题? 输出结果是不明确的连续值的时候就是回归问题,比如房价预测,销售额预测等。 输出结果是明确几个离散值的时候就是分类问题,比如字符识别…...

数据结构(6)线性表-队列
一、队列的概述 队列也是一种特殊的线性表,只允许在一段插入数据,另一端删除数据。插入操作的一端称为队尾,删除操作的一端称为队头。 如图: 二、队列相关操作 1.队列结构体的声明 类似于栈,他肯定也得借助于数组或…...
NumPy 2.x 完全指南【十七】转置操作
文章目录 1. 什么是转置2. 转置操作2.1 transpose2.2 ndarray.T2.3 moveaxis2.4 rollaxis2.5 permute_dims2.6 swapaxes2.7 matrix_transpose 1. 什么是转置 在线性代数中,矩阵转置是指将矩阵的行和列进行互换,即原矩阵的第 i i i 行、第 j j j 列元素…...

【数据架构04】数据湖架构篇
✅ 10张高质量数据治理架构图 无论你是数据架构师、治理专家,还是数字化转型负责人,这份资料库都能为你提供体系化参考,高效解决“架构设计难、流程不清、平台搭建慢”的痛点! 🌟限时推荐,速速收藏&#…...
使用OpenSSL生成根证书并自签署证书
生成根CA的私钥和证书 # 生成根 CA 的私钥 [rootdeveloper ssl]# openssl genrsa -out rootCA.key 2048 Generating RSA private key, 2048 bit long modulus (2 primes) ... ............................................................ e is 65537 (0x010001)# 使用私钥生…...

uniapp-商城-62-后台 商品列表(分类展示商品的布局)
每一个商品都有类别,比如水果,蔬菜,肉,粮油等等,另外每一个商品都有自己的属性,这些都在前面的章节进行了大量篇幅的介绍。这里我们终于完成了商品类的添加,商品的添加,现在到了该进…...

初识C++:模版
本篇博客主要讲解C模版的相关内容。 目录 1.泛型编程 2.函数模板 2.1 函数模版概念 2.2 函数模版格式 2.3 函数模版的原理 2.4 函数模版的实例化 1.隐式实例化:让编译器根据实参推演模板参数的实际类型 2. 显式实例化:在函数名后的<>中指定模…...