加载 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>