具有multipart/form-data的Spring security 3.2.0 RC1 csrf

Jim*_*Jay 2 spring spring-mvc csrf spring-security

我一直在使用Spring Security 3.2.0.RC1中的新csrf功能,并注意到它似乎不适用于enctype ="multipart/form-data"表单.

我有一个简单的Spring表单:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
...
<form:form action="${pageContext.request.contextPath}/model/create" modelAttribute="myForm" enctype="multipart/form-data">
Run Code Online (Sandbox Code Playgroud)

隐藏的csrf输入正在按预期呈现:

<input type="hidden" value="..." name="_csrf">
Run Code Online (Sandbox Code Playgroud)

但请求未通过csrf检查(如果我删除enctype ="multipart/form-data",它可以正常工作).我找到的唯一方法是将"?_csrf = ..."附加到我的动作网址,这很难看,因为令牌会出现在重定向的地址栏中.有没有人经历过相同/找到一个很好的解决方案?

M. *_*num 5

目前,CSFR保护需要/读取请求参数,但由于您的表单类型不同,表单内容不可用作请求参数.如果将其添加到URL,它将作为请求参数提供.

在内部DispatcherServlet存在多部分检测,并且这样的请求被包装在MultipartHttpServletRequest的实现中,该部分解码多部分请求并使内容可用作请求参数.

但是,Spring Security过滤器在此之前执行.在有最终解决方案之前,您可以配置MultipartFilter并在Spring Security过滤器链之前执行它.这基本上是在包装前解码DispatcherServlet.这里需要注意的一点是,您还需要将它放在Spring Security过滤器之前.

可以在Spring Security 参考指南中找到示例配置和其他解决方案.