首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Webflux multipart/form-data,启用了csrf,无论是否上传文件,都会获得无效的CSRF令牌

Webflux multipart/form-data,启用了csrf,无论是否上传文件,都会获得无效的CSRF令牌
EN

Stack Overflow用户
提问于 2018-08-29 18:03:00
回答 1查看 1.2K关注 0票数 5

禁用csrf后,我可以随心所欲地上传文件。仅当表单封装类型为multipart/ form -data时才会出现此问题,即使用403的“Invalid CSRF Token”。

通常,当我将enctype设置为multipart/ form -data时,即使是对于没有文件上传的表单,我也会得到相同的错误。

使用此依赖项:

代码语言:javascript
复制
<dependency>
  <groupId>org.synchronoss.cloud</groupId>
  <artifactId>nio-multipart-parser</artifactId>
  <version>...</version>
</dependency>

尝试在表单中包含隐藏的csrf输入,并尝试将其附加到url,但出现相同的错误

代码语言:javascript
复制
    <form  method="post" th:action="${'/add/' + id + '/documents?' + _csrf.headerName + '=' + _csrf.token}"  enctype="multipart/form-data">
        <input type="file" name="documents" multiple="multiple">
        <input  type="hidden"
                th:name="${_csrf.headerName}"
                th:value="${_csrf.token}" />
        <input type="hidden" name="_csrf" th:value="${_csrf.token}">
        <button class="btn btn-success btn-l">Upload</button>
    </form>

对于csrf注入,我有一个这样的控制器建议

代码语言:javascript
复制
@ControllerAdvice
public class SecurityAdvice {@ModelAttribute("_csrf")Mono<CsrfToken> csrfToken(final ServerWebExchange exchange) {
    final Mono<CsrfToken> csrfToken = exchange.getAttributeOrDefault(org.springframework.security.web.server.csrf.CsrfToken.class.getName(), Mono.empty());
    return csrfToken;
}

在安全性方面,我有以下bean:

代码语言:javascript
复制
 @Bean
    public ServerCsrfTokenRepository csrfTokenRepository() {
        WebSessionServerCsrfTokenRepository repository =
                new WebSessionServerCsrfTokenRepository();
        repository.setHeaderName("X-CSRF-TK");

        return repository;
    }

在我的SecurityWebFilterChain中像这样使用它:

代码语言:javascript
复制
.and().csrf().csrfTokenRepository(csrfTokenRepository())

更新:

禁用几个urls的csrf也足够了。找到了一些示例,但它们都是基于Servlet的版本。https://sdqali.in/blog/2016/07/20/csrf-protection-with-spring-security-and-angular-js/

EN

回答 1

Stack Overflow用户

发布于 2020-03-08 01:55:33

您可以简单地在过滤器链中启用它。

引用自documentation

代码语言:javascript
复制
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
    http
        // ...
        .csrf(csrf -> csrf.tokenFromMultipartDataEnabled(true))
    return http.build();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52074742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档