Spring security 3.2.0 RC1 csrf with multipart/form-data



我一直在 Spring Security 3.2.0.RC1 中使用新的 csrf 功能,并注意到它似乎不适用于 enctype="multipart/form-data" 表单。

我有一个简单的弹簧形式:

<%@ 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,这很丑陋,因为令牌随后出现在重定向的地址栏中。 有没有人经历过同样的事情/找到了一个很好的解决方案?

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

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

但是,Spring 安全性过滤器在此之前执行。在有最终解决方案之前,您可以配置多部分过滤器并在 Spring 安全过滤器链之前执行它。这基本上是将包装 en 解码 在DispatcherServlet前面。这里要提醒的一件事是,您还需要将其放在 Spring 安全性过滤器之前

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

最新更新