加载 swagger-ui.html 页面时,向 host:port/ 和主机发出请求:port/csfr
When loading the swagger-ui.html page, a request is made to host:port/ and host:port/csfr
我有一个 Spring boot 2 应用程序(rest API)并使用 Springfox Swagger 2 库,包括 UI 库。当我打开在 http://localhost:8080/swagger-ui.html
找到的 swagger 界面时,一切都按预期工作,但是发出了两个请求,在记录器中给出了 404 结果:
http://localhost:8080/ (nothing is mapped to the root of my app)
http://localhost:8080/csfr (this mapping also doesn't exist, but I know it stands
for 'cross site forged request')
显然 Swagger 这样做是因为它 'supports' 某种 csfr 令牌检查 explained here。是否可以配置这些 404 调用已经进行了几个月的调查,所以我现在正在考虑实施端点。我找不到有关实际实施内容的信息。 swagger 期待什么样的 header/token,它会如何处理其中的信息?我可以使用它来使我的应用程序(或 swagger 端点)更安全或更易于访问吗?简而言之:重点是什么 :)?
让我一一回答你的问题。
Why are the request made to http://localhost:8080/
and
http://localhost:8080/csrf
?
这是因为,Springfox Swagger 默认启用了对 CSRF 的支持。这样做的目的是,每当您尝试访问应用程序中的任何 swagger 端点时,它都会按以下顺序检查 CSRF 令牌并将其附加到请求 header.
- 您在
/
投放的元标记中的 CSRF 令牌
- 端点
/csrf
- 您的 cookie 中的 CSRF 令牌
Springfox Swagger 附加 CSRF 令牌的原因是,如果您的应用程序启用了 CSRF 保护,那么对 swagger 端点的请求将会失败,以防它们没有 CSRF 令牌作为 header.
的一部分
What kind of header/token is swagger expecting, and what will it do with the information in it?
正如我之前所说,swagger 需要一个 CSRF 令牌,当您尝试访问任何 swagger 端点时,它会将其附加到请求的 header。
Can I use this to make my app (or the swagger endpoint) more secure or accessible?
在您的应用程序中启用 CSRF 保护 将使您的应用程序免受 CSRF 攻击,而不一定 只是 通过提供 CSRF 令牌来 swagger附加到 header。如果您在您的应用中启用了 CSRF 保护,您必须通过上述 3 种方式中的任何一种提供 CSRF 令牌,以访问您应用中的任何 swagger 端点。您可以阅读有关启用 CSRF 保护的使用 here.
I'm failing to find information on what to actually implement
如果您没有在您的应用程序中启用 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、thymeleaf 等
2) 端点/csrf
定义端点 /csrf
以提供 CSRF 令牌。
@RequestMapping("/csrf")
public CsrfToken csrf() {
//logic to return the CSRF token
}
3) cookie 中的 CSRF 令牌
搜索的默认 cookie 名称是 XSRF-TOKEN
,返回的默认 header 名称是 X-XSRF-TOKEN
。 Spring security 提供了一种将 CSRF 令牌存储在 cookie 中的方法,按照 swagger 的要求,配置如下
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
}
实施以上 3 个中的任何一个都会提供带有 CSRF 令牌的 swagger 以附加到请求 header。
上面的引用来自 GitHub PR,它为 Springfox swagger 和我之前链接的 Spring 安全文档提供了 CSRF 支持。
当前有一个关于默认启用的 CSRF 支持的未决问题 here, and couple of open PRs with the fix #2639 and #2706。
取决于 2) 端点 /csrf
在我的例子中,我禁用了 WebSecurity,并且还得到了 /csrf 的 404 错误代码。如上所述,我用一个简单的控制器修复了它。这是我的控制器:
@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));
}
}
如果你使用它,你需要为网络安全添加maven依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
我有一个 Spring boot 2 应用程序(rest API)并使用 Springfox Swagger 2 库,包括 UI 库。当我打开在 http://localhost:8080/swagger-ui.html
找到的 swagger 界面时,一切都按预期工作,但是发出了两个请求,在记录器中给出了 404 结果:
http://localhost:8080/ (nothing is mapped to the root of my app)
http://localhost:8080/csfr (this mapping also doesn't exist, but I know it stands for 'cross site forged request')
显然 Swagger 这样做是因为它 'supports' 某种 csfr 令牌检查 explained here。是否可以配置这些 404 调用已经进行了几个月的调查,所以我现在正在考虑实施端点。我找不到有关实际实施内容的信息。 swagger 期待什么样的 header/token,它会如何处理其中的信息?我可以使用它来使我的应用程序(或 swagger 端点)更安全或更易于访问吗?简而言之:重点是什么 :)?
让我一一回答你的问题。
Why are the request made to
http://localhost:8080/
andhttp://localhost:8080/csrf
?
这是因为,Springfox Swagger 默认启用了对 CSRF 的支持。这样做的目的是,每当您尝试访问应用程序中的任何 swagger 端点时,它都会按以下顺序检查 CSRF 令牌并将其附加到请求 header.
- 您在
/
投放的元标记中的 CSRF 令牌
- 端点
/csrf
- 您的 cookie 中的 CSRF 令牌
Springfox Swagger 附加 CSRF 令牌的原因是,如果您的应用程序启用了 CSRF 保护,那么对 swagger 端点的请求将会失败,以防它们没有 CSRF 令牌作为 header.
的一部分What kind of header/token is swagger expecting, and what will it do with the information in it?
正如我之前所说,swagger 需要一个 CSRF 令牌,当您尝试访问任何 swagger 端点时,它会将其附加到请求的 header。
Can I use this to make my app (or the swagger endpoint) more secure or accessible?
在您的应用程序中启用 CSRF 保护 将使您的应用程序免受 CSRF 攻击,而不一定 只是 通过提供 CSRF 令牌来 swagger附加到 header。如果您在您的应用中启用了 CSRF 保护,您必须通过上述 3 种方式中的任何一种提供 CSRF 令牌,以访问您应用中的任何 swagger 端点。您可以阅读有关启用 CSRF 保护的使用 here.
I'm failing to find information on what to actually implement
如果您没有在您的应用程序中启用 CSRF 保护,那么为 swagger 实施 CSRF 令牌条款是没有用的,因为它只是多余的。但是如果你想为 swagger 实现 CSRF 令牌提供,你可以通过以下 3 种方法之一来实现:
1) 在 /
<html>
<head>
<meta name="_csrf" content="${_csrf.token}"/>
<!-- default header name is X-CSRF-TOKEN -->
<meta name="_csrf_header" content="${_csrf.headerName}"/>
</head>
这是为了防止您使用任何模板机制,例如 JSP、thymeleaf 等
2) 端点/csrf
定义端点 /csrf
以提供 CSRF 令牌。
@RequestMapping("/csrf")
public CsrfToken csrf() {
//logic to return the CSRF token
}
3) cookie 中的 CSRF 令牌
搜索的默认 cookie 名称是 XSRF-TOKEN
,返回的默认 header 名称是 X-XSRF-TOKEN
。 Spring security 提供了一种将 CSRF 令牌存储在 cookie 中的方法,按照 swagger 的要求,配置如下
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
}
实施以上 3 个中的任何一个都会提供带有 CSRF 令牌的 swagger 以附加到请求 header。
上面的引用来自 GitHub PR,它为 Springfox swagger 和我之前链接的 Spring 安全文档提供了 CSRF 支持。
当前有一个关于默认启用的 CSRF 支持的未决问题 here, and couple of open PRs with the fix #2639 and #2706。
取决于 2) 端点 /csrf
在我的例子中,我禁用了 WebSecurity,并且还得到了 /csrf 的 404 错误代码。如上所述,我用一个简单的控制器修复了它。这是我的控制器:
@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));
}
}
如果你使用它,你需要为网络安全添加maven依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>