加载swagger-ui.html页面时,对host:port /和host:port / csfr发出请求

use*_*155 7 java swagger swagger-ui spring-boot springfox

我有一个Spring boot 2应用程序(其余API),并使用Springfox Swagger 2库,包括UI库。当我打开swagger界面时,发现http://localhost:8080/swagger-ui.html所有功能都按预期运行,但是发出了两个请求,在logger中给出了404结果:

http:// localhost:8080 /(没有映射到我的应用程序的根目录)
http:// localhost:8080 / csfr(此映射也不存在,但我知道它代表“跨站点伪造的请求”)

显然Swagger这样做是因为它“支持”某种csfr令牌检查,如此处所述。现在已经进行了几个月的调查,以确定是否可以配置这些404调用,因此我现在正在考虑实现端点。我没有找到有关通常要执行的操作的信息。昂首阔步地期待什么样的标题/令牌,它将对其中的信息有什么作用?我可以使用它来使我的应用程序(或摇摇欲坠的端点)更加安全或可访问吗?简而言之:有什么意义:)?

Mad*_*hat 7

让我一一回答您的问题。

为什么要向http://localhost:8080/和 发送请求http://localhost:8080/csrf

这是因为,Springfox Swagger默认情况下启用了对CSRF的支持。它的作用是,每当您尝试访问应用程序中的所有swagger端点时,它都会按以下顺序检查CSRF令牌并将其附加到请求标头。

  • 您的元标记中的CSRF令牌在 /
  • 终点 /csrf
  • Cookie中的CSRF令牌

Springfox Swagger附加CSRF令牌的原因是,如果您的应用程序启用CSRF保护,则在不将CSRF令牌作为标头一部分的情况下,对swagger端点的请求将失败。

昂首阔步期望什么样的标题/令牌,它将对其中的信息有什么作用?

如前所述,swagger期望使用CSRF令牌,并在尝试访问任何swagger端点时将其附加到请求的标头中。

我可以使用它来使我的应用程序(或敏捷端点)更安全或可访问吗?

在您的应用程序中启用CSRF保护将使您的应用程序免受CSRF攻击的侵害,而不必通过提供CSRF令牌即可大张旗鼓地附加到标头。如果您已在应用程序中启用CSRF保护,则必须通过上述3种方式中的任何一种提供CSRF令牌,以访问应用程序中的所有swagger端点。您可以在此处阅读有关启用CSRF保护的用法。

我没有找到有关实际实施的信息

如果您未在应用程序中启用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>
Run Code Online (Sandbox Code Playgroud)

这是在您使用任何模板化机制(例如JSP,百里香叶等)的情况下。

2)端点 /csrf

定义一个端点/csrf以提供CSRF令牌。

  @RequestMapping("/csrf")
  public CsrfToken csrf() {
    //logic to return the CSRF token
  }
Run Code Online (Sandbox Code Playgroud)

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

实施以上3种方法之一将为CSRF令牌提供麻烦,以附加到请求标头。

上面的引用来自GitHub PR,它为Springfox swagger提供了CSRF支持,还提供了我之前链接的Spring安全文档。

目前关于默认开放的问题,使CSRF支持这里,和夫妇开的PR与修复#2639#2706