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

如何配置Spring Security以处理多部分/表单数据(POST)请求中的CSRF令牌?

张瀚漠
2023-03-14
  • 使用HTTP API进行客户端-服务器通信的单页(AngluarJS)web应用程序
  • Spring Security配置为使用CSRF保护(通过XML)
  • CSRF令牌通常在请求头中发送(工作正常)
  • 应用程序需要支持IE9中的文件上载

文件上传通过多部分/表单数据POST请求实现。通常这是使用客户端AJAX完成的,但IE9不支持FileAPI(http://www.w3.org/TR/FileAPI/).

IE9的解决方法是在隐藏的iframe中创建一个表单,并提交表单。CSRF令牌通过将其作为表单输入添加到请求正文中——原因是我无法在表单提交之前操作请求标头以添加CSRF标头。

Spring Security的组织。springframework。安全网状物csrf。CsrfFilter首先尝试从头中获取CSRF令牌,如果找不到,则尝试从参数中获取(通过HttpServletRequest.getParameter())

这不适用于正文中带有CSRF标记的多部分请求——getParameter()将始终返回null。

(另一方面,对getParameter()的调用也会将请求InputStream读取到底,因此我们必须在请求到达CsrfFilter之前对其进行包装,以便将请求InputStream“缓存”)

我想创建一个调用getPart()的CsrfFilter,但在仍然使用漂亮的clean Spring SecurityXML命名空间元素的情况下无法这样做。

原因是没有地方在配置中包含自定义CSRF过滤器——并且CsrfConfigrer被硬编码为使用org.springframework.security.web.csrf.CsrfFilter,因此无法注入。

我可以将代码添加到请求包装器类的重写getParameter()方法中,以尝试从多部分请求中解析参数——但实际上,这很难做到正确,并且宁愿避免此类维护成本。

  • 我们无法将CSRF令牌添加到请求标头,需要添加到请求正文
  • 请求是多部分/表单数据
  • Spring Security CSRF筛选器无法配置为从多部分请求解析CSRF令牌

欢迎提供任何帮助,无论是在客户端还是服务器端修复建议!

TIA公司

共有2个答案

隆兴修
2023-03-14

我已经实现了一个解决方案,现在似乎正在发挥作用,但有一些东西我真的不喜欢。。。

>

... 将请求InputStream复制到成员OutputStream。。。

    if(this.getContentType() != null && requestBody != null) {
            if(this.getContentType().contains(MediaType.APPLICATION_FORM_URLENCODED_VALUE) && requestBody.contains(parameterName+"="))
                return getFormEncodedParameter(requestBody, parameterName);
            else if(this.getContentType().contains(MediaType.MULTIPART_FORM_DATA_VALUE)  && requestBody.contains("name="+"\""+ parameterName +"\"")) {
                return getMultipartParameter(requestBody, parameterName);
            }
        }
    }

这两种方法都会进行一些字符串分析。。。这是我真的不喜欢的部分。它与核心业务逻辑没有任何关系,虽然它正在从多部分请求中获取csrf“参数”,但我对实现没有100%的信心。

盖锐
2023-03-14

您应该阅读参考文献中讨论CSRF和Multipart请求的部分。您有两个选项:

  • 在Spring Security之前包括MultiPartFilter

参考资料中描述了每种方法的优缺点。

最后,如果您想提供一个自定义过滤器,可以使用XML元素来实现,该元素只引用实现过滤器的Springbean。例如:

<http ...>
   ...
   <custom-filter ref="customCsrfFilter" position="CSRF_FILTER"/>
</http>
 类似资料:
  • 问题内容: 我在用Java应用程序服务器处理multipart / form-data请求时非常困难。从我发现的情况来看,servlet 3.0规范提供了诸如HttpServletRequest.getParts()之类的方法,这对于处理上传到我的servlet的表单数据是理想的。 但是,此方法是3.0 Servlet规范的一部分,并且我的应用程序服务器(Tomcat 6)尚不支持此方法。即使具有

  • 问题内容: 我正在尝试通过带有POST请求的照片上传 根据自述文件,我应该能够做到这一点 问题是,这不起作用。我收到测试服务器的回复,说它转储了0个post变量。 我已经确认该HTML小页面服务器处于工作状态 所以问题是,请求模块在做什么?有没有更好的方法来发送节点? 问题答案: 经过更多研究后,我决定使用。这使得分段上传非常容易。

  • 我正在使用Amazon SNS在我的HTTP/HTTPSendpoint上接收推送消息。endpoint应用程序是用Django编写的。要在endpoint(web app)上接收通知,HTTP/HTTPSendpoint需要订阅一个主题。 我的问题是当Amzaon SNS发送订阅确认时,它如何在POST请求中发送CSRF令牌,以便我处理请求并检索所需信息? 文档:http://docs.aws.

  • 您好,我正在独立应用程序上使用java中的vertx读取web应用程序中的端口。我想从表单中获取post数据。我的web应用程序有一个带有post方法的表单,我希望阅读该表单。我的逻辑是 > 创建垂直线 创建http服务器 创建处理程序请求(它不接受代码中的所有参数) 我不知道我错过了什么,我是vertx的新手。 出于某种原因,我不能在这里发布代码。 我的代码:https://pastebin.c

  • 问题内容: 在Apache Commons HttpClient的3.x版本中,可以进行multipart / form-data POST请求(2004年的示例)。不幸的是,这在HttpClient的4.0版本中不再可能。 对于我们的核心活动“ HTTP”,多部分内容超出了范围。我们很乐意使用由其他项目维护的多部分代码,但我对此一无所知。几年前,我们曾尝试将多部分代码移至commons编解码器,

  • 我正在使用请求库编写Web服务客户端。我正在获取包含文件和文本json的多部分/表单数据。我不知道如何解析它。是否有合适的库来解析python中的多部分/表单数据格式,或者我应该自己编写解析器? 我的代码: b'\r\n--c00750d1-8ce4-4d29-8390-b50bf02a92cc\r\nContent-Displace: form-data; name="playback Hash