SpringBoot通過(guò)配置Swagger權(quán)限解決Swagger未授權(quán)訪問(wèn)漏洞問(wèn)題
SpringBoot配置Swagger權(quán)限解決Swagger未授權(quán)訪問(wèn)漏洞
我們要談?wù)摰氖侨绾卧赟pringBoot項(xiàng)目中解決Swagger權(quán)限漏洞。
不要小看這個(gè)問(wèn)題,它可是有潛在風(fēng)險(xiǎn)的!讓我們一起來(lái)看看如何解決吧!
漏洞說(shuō)明
Swagger
是一個(gè)規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化 RESTful
風(fēng)格的 Web
服務(wù)。
其中,Swagger-UI
會(huì)根據(jù)開(kāi)發(fā)人員在代碼中的設(shè)置來(lái)自動(dòng)生成API說(shuō)明文檔。
若存在相關(guān)的配置缺陷,攻擊者可以在未授權(quán)的狀態(tài)下,翻查Swagger
接口文檔,得到系統(tǒng)功能API接口的詳細(xì)參數(shù),再構(gòu)造參數(shù)發(fā)包,通過(guò)回顯獲取系統(tǒng)大量的敏感信息。
這個(gè)漏洞的嚴(yán)重性不容小覷,因?yàn)橐坏┍焕茫赡軐?dǎo)致系統(tǒng)遭受到不可挽回的損失。
漏洞解決方法
方法一:通過(guò)application.yml配置,開(kāi)啟頁(yè)面訪問(wèn)限制。
在SpringBoot項(xiàng)目中,我們可以通過(guò)簡(jiǎn)單的配置來(lái)解決Swagger權(quán)限漏洞。
首先,我們需要在application.yml
文件中添加如下配置:
swagger: production: false basic: enable: true username: swaggerAuthorizedAdminUser #替換成生產(chǎn)環(huán)境的實(shí)際用戶名 password: adfaeYUps&@sdf_23134 #替換成生產(chǎn)環(huán)境的實(shí)際用戶名
方法二:通過(guò)SwaggerConfig類配置,開(kāi)啟可訪問(wèn)環(huán)境限制
如果你更喜歡通過(guò)代碼的方式來(lái)配置Swagger權(quán)限,可以使用SwaggerConfig
類。
下面是一個(gè)簡(jiǎn)單的示例:
@Configuration @EnableSwagger2 @Profile({"dev"}) public class SwaggerConfig implements WebMvcConfigurer { # 此處省略不涉及漏洞修復(fù)的代碼 }
漏洞預(yù)防
要想有效預(yù)防Swagger權(quán)限漏洞,我們需要排查接口是否存在賬號(hào)和密碼等敏感信息泄露。
這個(gè)過(guò)程可能需要一些技術(shù)手段,你可以參考一些相關(guān)文章進(jìn)行排查。記住,安全第一!
心得:
通過(guò)配置和代碼示例,我們可以有效地保護(hù)我們的系統(tǒng)免受潛在的安全威脅。
SpringBoot輕松配置Swagger
針對(duì)springboot項(xiàng)目輕松引入swagger做一個(gè)示例。
Swagger是什么?
Swagger 是一個(gè)用于生成、描述和調(diào)用 RESTful 接口的 Web 服務(wù)。
通俗的來(lái)講,Swagger 就是將項(xiàng)目中所有(想要暴露的)接口展現(xiàn)在頁(yè)面上,并且可以進(jìn)行接口調(diào)用和測(cè)試的服務(wù)。
PS:Swagger 遵循了 OpenAPI 規(guī)范,OpenAPI 是 Linux 基金會(huì)的一個(gè)項(xiàng)目,試圖通過(guò)定義一種用來(lái)描述 API 格式或 API 定義的語(yǔ)言,來(lái)規(guī)范 RESTful 服務(wù)開(kāi)發(fā)過(guò)程。
Swagger 官網(wǎng)地址:https://swagger.io/Swagger 有什么用?
從上述 Swagger 定義我們不難看出 Swagger 有以下 3 個(gè)重要的作用:將項(xiàng)目中所有的接口展現(xiàn)在頁(yè)面上,這樣后端程序員就不需要專門為前端使用者編寫專門的接口文檔;
當(dāng)接口更新之后,只需要修改代碼中的 Swagger 描述就可以實(shí)時(shí)生成新的接口文檔了,從而規(guī)避了接口文檔老舊不能使用的問(wèn)題;
通過(guò) Swagger 頁(yè)面,我們可以直接進(jìn)行接口調(diào)用,降低了項(xiàng)目開(kāi)發(fā)階段的調(diào)試成本。
使用步驟
1.pom導(dǎo)入swagger包以及knief
代碼如下(示例):
<properties> <swagger.version>2.9.2</swagger.version> <knife4j.version>2.0.2</knife4j.version> </properties> <!-- 在dependencies標(biāo)簽下添加如下, knife,是 swagger 的增強(qiáng)版,同一個(gè)作者開(kāi)發(fā)。該UI增強(qiáng)包主要包括兩大核心功能:文檔說(shuō)明 和 在線調(diào)試 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${swagger.version}</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${swagger.version}</version> </dependency> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>${knife4j.version}</version> </dependency>
2.添加swagger配置類
代碼如下(示例):
package com.dianhun.corporate.compliance.config; import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.ParameterBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.schema.ModelRef; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Parameter; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; import java.util.ArrayList; import java.util.List; @Configuration @EnableSwagger2 @EnableKnife4j public class SwaggerConfig { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.dianhun.corporate.compliance")) .paths(PathSelectors.any()) .build(); // .globalOperationParameters(setHeaderToken()); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .description("文檔描述") .title("接口文檔") .version("1.0") .build(); } }
OK,這就能輕松使用swagger調(diào)試了。
總結(jié)
這些僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
HttpClient實(shí)現(xiàn)調(diào)用外部項(xiàng)目接口工具類的示例
下面小編就為大家?guī)?lái)一篇HttpClient實(shí)現(xiàn)調(diào)用外部項(xiàng)目接口工具類的示例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10Spring源碼學(xué)習(xí)之動(dòng)態(tài)代理實(shí)現(xiàn)流程
這篇文章主要給大家介紹了關(guān)于Spring源碼學(xué)習(xí)之動(dòng)態(tài)代理實(shí)現(xiàn)流程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Springmvc nginx實(shí)現(xiàn)動(dòng)靜分離過(guò)程詳解
這篇文章主要介紹了Springmvc nginx實(shí)現(xiàn)動(dòng)靜分離過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Java實(shí)現(xiàn)解析dcm醫(yī)學(xué)影像文件并提取文件信息的方法示例
這篇文章主要介紹了Java實(shí)現(xiàn)解析dcm醫(yī)學(xué)影像文件并提取文件信息的方法,結(jié)合實(shí)例形式分析了java基于第三方庫(kù)文件針對(duì)dcm醫(yī)學(xué)影像文件的解析操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-04-04Java GZip 基于內(nèi)存實(shí)現(xiàn)壓縮和解壓的方法
這篇文章主要介紹了Java GZip 基于內(nèi)存實(shí)現(xiàn)壓縮和解壓的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08