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

时间:2019-04-08 21:28:08

标签: java spring-boot swagger swagger-ui springfox

我有一个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调用,因此我现在正在考虑实现端点。我没有找到有关通常要执行的操作的信息。昂首阔步地期待什么样的标题/令牌,它将对其中的信息有什么作用?我可以使用它来使我的应用程序(或摇摇欲坠的端点)更加安全或可访问吗?简而言之:有什么意义:)?

2 个答案:

答案 0 :(得分:4)

让我一个接一个地回答您的问题。

  

为什么向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攻击,而不必 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安全文档。

当前存在一个关于默认启用的CSRF支持here以及带有修复#2639#2706的开放PR的公开问题。

答案 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));
    }