带有multipart / form-data的Spring Security 3.2.0 RC1 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 =
…”,这很丑陋,因为令牌随后在重定向时显示在地址栏中。有没有人经历过同样的事情/找到了一个不错的解决方案?


问题答案:

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

内部DispatcherServlet有多部分检测,这种请求被包装在MultipartHttpServletRequest的实现中,该实现对部分请求进行解码,并使内容可用作请求参数。

但是,Spring
Security过滤器会在此之前执行。在找到最终解决方案之前,您可以配置MultipartFilter并在Spring
Security过滤器链之前执行它。基本上,这将包装环绕解码置于的前面DispatcherServlet。这里要提醒的一件事是,您还需要将其放在Spring
Security过滤器 之前

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