2

我一直在使用 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 = ...”附加到我的操作url,这很丑陋,因为令牌然后出现在重定向的地址栏中。有没有人经历过同样的/找到了一个很好的解决方案?

4

1 回答 1

5

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

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

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

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

于 2013-09-15T19:03:43.800 回答