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

时间:2013-09-13 23:52:48

标签: spring spring-mvc spring-security csrf

我一直在使用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">

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

<input type="hidden" value="..." name="_csrf">

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

1 个答案:

答案 0 :(得分:5)

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

DispatcherServlet内部有多部分检测,这样的请求包含在MultipartHttpServletRequest的实现中,该实现解码多部分请求并使内容可用作请求参数。

然而,Spring Security过滤器在此之前执行。在a final solution之前,您可以配置MultipartFilter并在Spring Security过滤器链之前执行它。这基本上是在DispatcherServlet前面解码包装。这里需要注意的一点是,您还需要在之前使用Spring Security过滤器。

可以在Spring Security reference guide中找到示例配置和其他解决方案。