禁用csrf后,我可以随心所欲地上传文件。仅当表单封装类型为multipart/ form -data时才会出现此问题,即使用403的“Invalid CSRF Token”。
通常,当我将enctype设置为multipart/ form -data时,即使是对于没有文件上传的表单,我也会得到相同的错误。
使用此依赖项:
<dependency>
<groupId>org.synchronoss.cloud</groupId>
<artifactId>nio-multipart-parser</artifactId>
<version>...</version>
</dependency>
尝试在表单中包含隐藏的csrf输入,并尝试将其附加到url,但出现相同的错误
<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注入,我有一个这样的控制器建议
@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:
@Bean
public ServerCsrfTokenRepository csrfTokenRepository() {
WebSessionServerCsrfTokenRepository repository =
new WebSessionServerCsrfTokenRepository();
repository.setHeaderName("X-CSRF-TK");
return repository;
}
在我的SecurityWebFilterChain中像这样使用它:
.and().csrf().csrfTokenRepository(csrfTokenRepository())
更新:
禁用几个urls的csrf也足够了。找到了一些示例,但它们都是基于Servlet的版本。https://sdqali.in/blog/2016/07/20/csrf-protection-with-spring-security-and-angular-js/
发布于 2020-03-08 01:55:33
您可以简单地在过滤器链中启用它。
引用自documentation:
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http
// ...
.csrf(csrf -> csrf.tokenFromMultipartDataEnabled(true))
return http.build();
}
https://stackoverflow.com/questions/52074742
复制相似问题