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

Spring Security 3.2 CSRF支持多部分请求

沃宇
2023-03-14

我们在应用程序中使用Spring Security性已有几年了。上周,我们将Spring Security从3.1.4版升级到3.2.0版。升级进行得很顺利,升级后我们没有发现任何错误。

在浏览Spring Security 3.2.0文档时,我们发现了围绕CSRF保护和安全标头的新增功能。我们遵循Spring Security 3.2.0文档中的说明,为受保护的资源启用CSRF保护。在我们的应用程序中,它适用于正则形式,但不适用于多部分形式。在提交表单时,CsrfFilter抛出一个拒绝访问错误,理由是请求中没有CSRF令牌(通过调试日志确定)。我们已经尝试使用Spring Security文档中建议的第一个选项,使CSRF保护与多部分表单一起工作。我们不想使用第二个建议的选项,因为它会通过URL泄漏CSRF令牌,并带来安全风险。

我们基于文档的配置的相关部分可以在Github上作为要点提供。我们使用的是Spring版本4.0.0。

请注意,我们已经尝试了以下变体,但没有成功:

  1. 未在web.xml中声明MultipartFilter
  2. 未为web.xml中的MultipartFilter设置解析器bean名称。
  3. webContext.xml中使用默认的解析器bean名称filterMultipartResolver

更新:我已确认记录的行为即使在单页示例应用程序中也不起作用。有人能确认记录的行为按预期工作吗?是否有可以使用的示例工作应用程序?

共有3个答案

叶鸿煊
2023-03-14

在解决了这个问题之后,我找到了一个更简单的解决方案,只使用Spring Security中定义的请求头,而不是尝试将CSRF令牌作为多部分内容的一部分嵌入。

这是我使用AJAX库在我的jsp中设置文件上传标头的简单方法:

var uploader = new AjaxUpload({
        url: '/file/upload',
        name: 'uploadfile',
        multipart: true,
        customHeaders: { '${_csrf.headerName}': '${_csrf.token}' },
        ...
        onComplete: function(filename, response) {
            ...
        },
        onError: function( filename, type, status, response ) {
            ...
        }
});

它依次发送带有标头的多部分请求:

X-CSRF-TOKEN: abcdef01-2345-6789-abcd-ef0123456789

他们建议嵌入<代码>

<html>
<head>
    <meta name="_csrf" content="${_csrf.token}"/>
    <!-- default header name is X-CSRF-TOKEN -->
    <meta name="_csrf_header" content="${_csrf.headerName}"/>
    <!-- ... -->
</head>
<body>
    <!-- ... -->
    <script>
        var token = $("meta[name='_csrf']").attr("content");
        var header = $("meta[name='_csrf_header']").attr("content");
        // Do whatever with values
    </script>
</body>
</html>

更多信息:Spring Security-用于AJAX和JSON请求的CSRF

漆雕成弘
2023-03-14

本部分:

<filter-mapping>
    <filter-name>multipartFilter</filter-name>
    <servlet-name>/*</servlet-name>
</filter-mapping>

应该是:

<filter-mapping>
    <filter-name>multipartFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

这是Spring Security 3.2.0文档中的一个错误。该错误已报告,将在即将发布的版本中修复。

司雅畅
2023-03-14

我在Spring Security团队的帮助下解决了这个问题。我已经更新了要点,以反映工作配置。我必须遵循下面给出的步骤,才能让一切按预期进行。

1、常用步骤

MultipartFilter添加到web.xml,如@holmis83的答案中所述,确保它是在Spring Security配置之前添加的:

<filter>
    <display-name>springMultipartFilter</display-name>
    <filter-name>springMultipartFilter</filter-name>
    <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>springMultipartFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
    <display-name>springSecurityFilterChain</display-name>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>ERROR</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

2.1. 使用Apache Commons多部分解析器

确保在根Spring应用程序上下文中有一个名为filterMultipartResolver的Apache Commons Multipart Resolver bean。我将再次强调这一点,确保在根Spring上下文(通常称为Application ationContext.xml)中声明Multipart Resolver。例如,

网状物xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath*:springWebMultipartContext.xml
    </param-value>
</context-param>

SpringWebMultipartContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="filterMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="100000000" />
    </bean>
</beans>

确保bean被称为filterMultipartResolver,因为web中配置的MultipartFilter没有提取任何其他bean名称。xml。我的初始配置不起作用,因为这个bean名为multipartResolver。我甚至尝试使用web将bean名称传递给MultipartFilter。xml初始化参数,但这也不起作用。

2.2.使用Tomcat Multipart支持

Tomcat 7.0具有内置的多部分支持,但必须显式启用它。按照以下方式更改全局Tomcatcontext.xml文件,或者在WAR文件中包含本地context.xml文件,以便此支持在不对应用程序进行任何其他更改的情况下工作。

<Context allowCasualMultipartParsing="true">
    ...
</Context>

在使用Apache Commons多部分解析器进行这些更改之后,我们的应用程序目前正在Tomcat、Jetty和Weblogic上运行。

 类似资料:
  • 问题内容: 几年来我们一直在我们的应用程序中使用Spring Security。上周,我们将Spring Security从3.1.4版本升级到了3.2.0。升级进行得很好,并且升级后我们没有发现任何错误。 在浏览Spring Security 3.2.0文档时,我们发现了CSRF保护和安全标头周围的新增功能。我们按照Spring Security 3.2.0文档中的说明为受保护的资源启用CSRF

  • 多请求支持 控制台编辑器允许您编写相互层叠的多个请求,像在控制台章节展示中那样,您可以通过定位光标并使用动作菜单向 Elasticsearch 提交请求。类似的,您可以一次选择多个请求: 图 5. 选择多个请求 控制台会依次提交请求到 Elasticsearch ,并将 Elasticsearch 返回的结果显示在右边窗口。这在调试问题或在多个场景中尝试查询组合时会非常方便。 选择多个请求还允许您

  • 为了解决这个问题,我还添加了一个MultipartResolver 很可能是一些愚蠢的东西,但我找不到我错过的东西。

  • 有没有人知道一个教程,或一个示例项目,我可以从中获得想法,使一个多部分的上传工作?是否需要使用TransferManager来执行此操作? 提前多谢!

  • 问题内容: 我有一个API端点,必须向其发送多部分HTTP请求,该请求由两部分组成(文件系统文件)和(JSON对象)。 经过一些研究,我发现了如何在AngularJS中执行多部分请求: 1) 该函数最初具有以下形式: 此实现的结果是,请求的各个部分没有设置。 Blob ,对象看起来像这样(有点混乱,基本上第一部分是of ,第二个): 第二种方法为请求的每个部分设置了正确的内容,但没有为部分设置任何

  • 当我尝试上传一个文件和标题时,我得到以下异常。我正在将Content-Type头设置为multipart/form-data。 我如何在Spring Security后面做文件上传?这个请求似乎从未被转换成MultiPartHttpServerRequest,所以它不起作用? 如果更改方法签名以采用@RequestParam MultipartFile,则会出现如下异常: ...但我在XML中配置