Spring security 3.2.0 RC1 csrf with multipart/form-data

Posted

技术标签:

【中文标题】Spring security 3.2.0 RC1 csrf with multipart/form-data【英文标题】: 【发布时间】:2013-09-18 18:21:41 【问题描述】:

我一直在使用 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,这很丑陋,因为令牌然后出现在重定向的地址栏中。有没有人遇到过同样的情况/找到了不错的解决方案?

【问题讨论】:

Spring CSRF token does not work, when the request to be sent is a multipart request的可能重复 【参考方案1】:

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

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

但是 Spring Security 过滤器在此之前执行。直到有a final solution,你可以配置MultipartFilter并在Spring Security过滤器链之前执行它。这基本上将包装和解码拉到DispatcherServlet 前面。这里要提醒的一件事是,您还需要将它放在 Spring Security 过滤器之前。

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

【讨论】:

注意:@m-deinum 引用的 Jira 没有解决。您可以在这里找到如何使用 multipart/form-data 进行 CSRF 保护docs.spring.io/spring-security/site/docs/3.2.x-SNAPSHOT/… 我已将 MultipartFilter 添加到我们的 web.xml 中,如最新的 Spring Security 文档中所述,但每当调用需要多部分文件的控制器方法时,仍然会收到拒绝访问错误。相关配置见gist.github.com/manish-in-java/8661970。 你已经添加了,但是你的配置错误。您将MultipartResolver 置于错误的配置中。 MultipartFilter 只从根应用程序上下文中读取(ContextLoaderListener 加载的那个,移动到它加载的 xml 文件中)。 @M.Deinum 应用 MultipartFilter 后,我在 Filter 中得到空文件并且没有部件数据。你能推荐点什么吗? @M.Deinum 找到它...将 bean MultipartFilter 的位置更改为 applicationContext.xml 并且它起作用了

以上是关于Spring security 3.2.0 RC1 csrf with multipart/form-data的主要内容,如果未能解决你的问题,请参考以下文章