当前位置: 首页 > 知识库问答 >
问题:

带enctype=“多部分/表单数据”[重复]的Spring Security CSRF

壤驷彦
2023-03-14

我在jsp文件中有此表单:

<form:form method="POST" commandName="advertForm" onsubmit="return checkAddress();" enctype="multipart/form-data">

<form:errors path="*" cssClass="errorblock" element="div"/>

<table>
    <tr>
        <td>Text:</td>
        <td><form:input path="advert.text"/></td>
        <td><form:errors path="advert.text" cssClass="error"/></td>
    </tr>
    <table id="fileTable">
        <tr>
            <td><input name="images[0]" type="file" /></td>
        </tr>
        <tr>
            <td><input name="images[1]" type="file" /></td>
        </tr>
    </table>
    <tr>
        <td colspan="1"><a style="text-decoration: none" href="/"><input type="button" value="Cancel"/></a></td>
        <td colspan="2"><input type="submit" value="Save"/></td>
    </tr>
      <input type="hidden"
             name="${_csrf.parameterName}"
             value="${_csrf.token}" />
</table>
</form:form>

这个广告表单类:

public class AdvertForm {
    private Advert advert;
    private List<MultipartFile> images;

    public Advert getAdvert() {
        return advert;
    }

    public void setAdvert(Advert advert) {
        this.advert = advert;
    }

    public List<MultipartFile> getImages() {
        return images;
    }

    public void setImages(List<MultipartFile> images) {
        this.images = images;
    }
}

在相应的控制器中,我使用此参数接收数据:

@ModelAttribute("advertForm") AdvertForm advertForm

问题是当csrf在sping-security.xml被禁用它的工作正常-我可以看到选择的文件在广告orm.get图像(),但当我启用csrf它停止工作:

Invalid CSRF token found for http://localhost:8080

我试图通过以下步骤解决这个问题:

>

<filter>
    <filter-name>MultipartFilter</filter-name>
    <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>MultipartFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

我定义了filterMultipartResolver:

并将其添加到web.xml:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        ......,
        /WEB-INF/springWebMultipartContext.xml
    </param-value>
</context-param>

在Tomcat 7中启用了CasualMultipartParsing(我使用独立库从IDE运行)

ctx。setAllowCasualMultipartParsing(true)

现在表单工作-我没有收到任何csrf错误。但当控制器接收到advertForm参数advertForm时。getImages()返回null,但返回advertForm。getText()返回用户输入的文本。在日志中,我可以看到这一行:

DEBUG  CommonsMultipartResolver - Found multipart file [images[0]] of size 3117 bytes with original filename [11111111.txt], stored in memory

我的错在哪里?


共有1个答案

薛博艺
2023-03-14

我忘了提到我定义了这个bean:

<bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />

这是个问题。删除此bean后,一切正常。

 类似资料:
  • 每当我将enctype="multipart/form-data"添加到我的html表单时,我都会得到 如果我把enctype去掉它就会工作 我这样发送csrf代码: 我的Express文件: 我的表格: 我的路线文件 最后是管理员。js文件 此外,对于依赖关系: 我认为原因是multer,但后来我更改了multer版本并停止将其用作全局中间件,我仍然会遇到这个错误。 注意:如果我将操作更改为在U

  • 我一直在使用Spring Security 3.2.0中的新csrf功能。并注意到它似乎不适用于enctype=“多部分/表单数据”表单。 我有一个简单的Spring形状: 隐藏的csrf输入按预期呈现: 但是请求没有通过csrf检查(如果我删除enctype="multipart/form-data",它会很好地工作)。我发现的唯一方法是附加“?_csrf=...”到我的操作url,这是丑陋的,

  • 没有边界的多部分/表单数据请求是否有效?根据规范,当有超过1个部分时,使用边界将它们分开(并且该边界不应该是身体的一部分)。我有一个请求,其中有一个单一的主体作为原始内容或文件,在内容类型中,我们传递“多部分/表单数据”。这种要求实际上有效吗?

  • 通常,我需要通过JSOUP将数据以响应multipart/form-data的形式发送到站点 作为一个示例,使用一个简单的窗体来sgeniriruet您的查询。 <表单操作=«localhost:8000»方法=«post»enctype=»多部分/表单数据» <输入类型=»文本»名称=»文本»值=»文本默认值» <输入类型=»文件»名称=»文件1» <输入类型=»文件»名称=»文件2» 提交 通

  • 我目前正在尝试解析我通过Chrome中的Postman插件发送的。然而,我得到的输出如下: 当我尝试调试时,会得到这个输出。当我尝试时,我得到一个空数组,所以我假设数据的格式不正确(只是一个字符串)。在我写我自己的算法之前,我想确定我没有用这个算法重新发明轮子。我做错什么了?或者,如果没有,是否存在一些CakePHP3函数来处理这个问题? 更新 我发现了代码中的错误,路由过程似乎以某种方式将pos

  • 问题内容: 我正在编写一个RESTful API。我在使用不同的动词上载图像时遇到麻烦。 考虑: 我有一个对象,可以通过对URL的发布/放置/删除/获取请求来创建/修改/删除/查看。如果有要上载的文件,则请求是多部分形式;如果只有文本要处理,则请求是application / xml。 为了处理与对象相关的图像上传,我正在做类似的事情: 这里的主要问题是在尝试处理放置请求时,显然$ _POST不包