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的主要内容,如果未能解决你的问题,请参考以下文章
由于重定向循环,Grails Spring Security 无法显示登录页面
CharacterEncodingFilter 不能与 Spring Security 3.2.0 一起使用
spring security 3.2.0 csrf 令牌在 freemarker 模板中不起作用
在使用 Spring Security 3.2.0 保护应用程序并提供 javascript 文件时,如何设置内容类型标头?
使用 Spring Security 3.2.0.RELEASE,如何在没有标签库的纯 HTML 页面中获取 CSRF 令牌