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

如何为Spring Security 3.2添加csrf令牌以立即上传文件?

佟翰林
2023-03-14

我一直在尝试在具有Spring Security 3.2的Spring应用程序中为文件上传添加CSRF令牌。Spring Security CSRF留档建议我们在Spring Security过滤器之前添加MultipartFilter,以便在完全没有Spring Security的情况下临时文件上传成为可能(因此也无需CSRF检查)。但这不会不安全吗?虽然,为了至少有一个工作的软件,我应用了上述方法,但它不起作用。在错误日志中,看起来多部分过滤器在Spring Security过滤器之前被触发,但它仍然在Spring Security过滤器中,然后进入CSRF过滤器。我正在使用

我可以在应用这个方面得到一些帮助吗?如果我们可以添加CSRF令牌本身,而不是绕过安全过滤器,那就更好了。


共有1个答案

史淇
2023-03-14

MultipartFilter不会阻止调用Spring Security过滤器。但通过将其作为过滤器链中的第一个过滤器,当正文中有一个csrf令牌作为参数可用时,它可以使csrf令牌过滤器从正文中提取csrf令牌并进行验证。

简短回答

您仍然需要发送csrf令牌,但可以在正文中作为隐藏参数发送,也可以在url中作为查询参数发送。

注:

>

如果不清楚,只需让GET和POST请求在没有fileupload的情况下工作,就可以了解csrf流

备选方案:仅在文件上载时跳过csrf

    @Override
    protected void configure(HttpSecurity http) throws Exception {


        http.csrf()
                .requireCsrfProtectionMatcher(new CustomRequiresCsrfMatcher())
            .and()
            ......
    }

    private static final class CustomRequiresCsrfMatcher 
                                implements RequestMatcher {
        private final HashSet<String> allowedMethods = new HashSet<>(
                Arrays.asList("GET", "HEAD", "TRACE", "OPTIONS"));


        @Override
        public boolean matches(HttpServletRequest request) {
            String upload_url = "your file upload url";//update it
            
            return !this.allowedMethods.contains(request.getMethod()) &&
                     
                 !request.getRequestURL().toString().contains(upload_url);
        }
    }
 类似资料:
  • 我使用, Spring Framework 4.0.0版本(GA) Spring Security 3.2.0版本(GA) 支柱2.3.16 其中,我使用内置安全令牌来防范CSRF攻击。 这是一个多部分请求,其中CSRF令牌对Spring security不可用,除非正确配置了多部分过滤器和多部分解析器,以便Spring处理多部分请求。 web中的MultipartFilter。xml的配置如下所

  • 当我运行测试时,我会得到以下错误(找不到令牌或令牌为空): 我找到了一个暂时的解决方法,但它不是一个好的解决方法…

  • 我希望在产品页面上添加一个“立即购买”按钮,点击后重定向到结账页面,而不将产品添加到购物车中。我注意到在Woocommerce之前也有人问过一个类似的问题--在产品页面上添加到购物车和立即购买按钮 我认为最好的方法是创建另一个购物车和结账实例,但我只是不知道如何实现它,有人能帮助我吗? http://wordpress.org/extend/plugins/woocommerce/

  • 我们基于Angular的webapp与运行在不同域和上下文路径上的企业门户集成。我使用基于Spring Security的CSRF令牌来验证传入的请求。该应用程序在本地运行得非常好,但当我将其与门户集成时,所有post调用都失败了403,因为Angular无法读取XSRF令牌并将请求头中的X-XSRF-Token设置为API调用。经过调查,我发现门户和我们的应用程序的上下文路径不同,因此sprin

  • 我试图创建一个带有动态预填充字段的Django表单:也就是说,当从下拉菜单中选择一个字段()时,其他字段会自动预填充相应的数据。为此,我希望在选择下拉选项后立即向服务器发送POST请求。 到目前为止,我已经尝试了以下模板(以下https://docs.djangoproject.com/en/2.0/ref/csrf/): 但是,当我选择一个下拉选项时,我会得到一个 新:17未捕获的语法错误:意外

  • 我读过关于CSRF和不可预测的同步令牌模式是如何用来防止它的。我不太明白它是如何工作的。 让我们以这个场景为例: 用户使用以下表单登录到站点: 服务器还将令牌存储在会话中。发送请求时,它将表单数据中的令牌与会话中的令牌进行比较。 当黑客可以编写JavaScript代码时,如何防止CSRF: 发送GET请求到站点 接收包含请求表单的html文本。 在html文本中搜索CSRF令牌。 使用该令牌发出恶