我有一个Spring boot 2应用程序(REST API),并使用Springfox Swagger 2库,包括UI库。当我打开位于http://localhost:8080/swagger-ui.html
的swagger界面时,一切正常,但是在记录器中发出了两个给出404结果的请求:
http://localhost:8080/(所有内容均未映射到我的应用程序的根目录)
http://localhost:8080/csfr(此映射也不存在,但我知道它可以 “跨网站伪造的请求”)
显然Swagger这样做是因为它“支持”某种explained here的csfr令牌检查。现在已经进行了几个月的调查,以确定是否可以配置这些404调用,因此我现在正在考虑实现端点。我没有找到有关通常要执行的操作的信息。昂首阔步地期待什么样的标题/令牌,它将对其中的信息有什么作用?我可以使用它来使我的应用程序(或摇摇欲坠的端点)更加安全或可访问吗?简而言之:有什么意义:)?
答案 0 :(得分:4)
让我一个接一个地回答您的问题。
为什么向
http://localhost:8080/
发送请求,并且http://localhost:8080/csrf
?
这是因为,Springfox Swagger默认情况下启用了对CSRF的支持。它的作用是,每当您尝试访问应用程序中的所有swagger端点时,它都会按以下顺序检查CSRF令牌并将其附加到请求标头。
/
投放/csrf
Springfox Swagger附加CSRF令牌的原因是,如果您的应用程序启用了 CSRF保护,则在没有CSRF令牌作为一部分的情况下,对swagger端点的请求将失败标题。
昂首阔步期望什么样的标题/令牌,它将对其中的信息有什么作用?
正如我之前所说,swagger期望使用CSRF令牌,并在尝试访问任何swagger端点时将其附加到请求的标头。
我可以使用它来使我的应用程序(或敏捷端点)更安全或更易于访问吗?
在您的应用程序中启用CSRF保护将使CSRF令牌大张旗鼓地附在标头上,可以使您的应用程序免受CSRF攻击,而不必 just 。如果您已在应用程序中启用CSRF保护,则必须必须通过上述3种方式中的任何一种来提供CSRF令牌,以访问应用程序中的所有swagger端点。您可以阅读有关启用CSRF保护here的信息。
我无法找到有关实际实施的信息
如果您未在应用程序中启用CSRF保护,则无需对swagger实现CSRF令牌规定,因为这将是多余的。但是,如果您想为swagger实现CSRF令牌提供,则可以通过以下3种方法之一来实现:
1)您的元标记中的CSRF令牌在/
投放
<html>
<head>
<meta name="_csrf" content="${_csrf.token}"/>
<!-- default header name is X-CSRF-TOKEN -->
<meta name="_csrf_header" content="${_csrf.headerName}"/>
</head>
这是在使用任何模板机制(例如JSP,百里香叶等)的情况下。
2)端点/csrf
定义端点/csrf
以提供CSRF令牌。
@RequestMapping("/csrf")
public CsrfToken csrf() {
//logic to return the CSRF token
}
3)Cookie中的CSRF令牌
搜索的默认cookie名称为XSRF-TOKEN
,返回的默认标头名称为X-XSRF-TOKEN
。春季安全性提供了一种方法,可以按照下面的配置由swagger要求将CSRF令牌存储在cookie中
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
}
实施以上三个方法之一将使CSRF令牌大张旗鼓地附加到请求标头上。
上面的引用来自GitHub PR,它为Springfox swagger提供了CSRF支持,还提供了我之前链接的Spring安全文档。
答案 1 :(得分:2)
取决于2)端点/ csrf
就我而言,直到现在我都禁用了WebSecurity,并且还获得了/ csrf的404错误代码。如上所述,我使用一个简单的Controller进行了修复。这是我的控制器:
strConn = "Driver={MySQL ODBC 8.0 Unicode Driver};SERVER=(my old computer ip address);DATABASE=Database;USER=root;PASSWORD=(password)"
}
如果使用它,则需要添加Maven依赖项以实现网络安全:
@Controller
public class CSRFController {
@RequestMapping(value = "/csrf", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
public ResponseEntity<CsrfToken> getToken(final HttpServletRequest request) {
return ResponseEntity.ok().body(new HttpSessionCsrfTokenRepository().generateToken(request));
}