【问题标题】:CSRF token per request in spring security春季安全中每个请求的 CSRF 令牌
【发布时间】:2017-06-29 05:40:18
【问题描述】:

如何在spring security 3.2中实现每个请求的csrf。目前它是按会话处理的。这是必须的要求

请发布需要执行的更改。

在securitycontext.xml中

  <http>
    <csrf />
    </http>

已给出并且应用程序正在使用每个会话的令牌

【问题讨论】:

  • 但是为什么呢?它不增加任何安全性,并杀死缓存和返回按钮
  • 应用程序需要该功能。高度安全的应用程序
  • 返回按钮也是必需的。

标签: spring spring-security csrf csrf-protection


【解决方案1】:

您可以通过提供您自己的此接口实现来更改CsrfTokenRepository 的默认实现,并将其配置如下:

<http>
    <csrf token-repository-ref="myRequestCsrfTokenRepository"/>
</http>
<b:bean id="myRequestCsrfTokenRepository"
        class="com.company.security.RequestCsrfTokenRepository"/>

但是……虽然你写道这是必须的要求,但你真的应该重新考虑一下。我什至建议尝试说服另一端,这种更改可以为应用程序用户带来更多安全性,但也会带来很多不便,有时甚至是奇怪的行为,并且总体上会降低可用性和用户体验。例如。见Different csrf token per request in Spring security

【讨论】:

  • 我完全同意,每个请求都是多余的,您将花费大量时间(数周)尝试以不会惹恼最终用户的方式使其工作。默认实现将 CSRF 令牌存储在会话中,当您将其更改为 per-request 时,基本上不可能有多个选项卡!
  • 感谢您的回答。我尝试创建自定义存储库,但我没有清楚地了解实施情况。我的实施不允许我自己登录。如果我们在每个请求上创建新令牌怎么能我们比较令牌?你能帮忙吗?
  • 安全团队试图使用相同的令牌进行访问。我的印象是他们拿走了响应令牌。我的错。通过实现这个令牌将用于请求..我得到了它将执行谢谢。
  • 请您提供 com.company.security.RequestCsrfTokenRepository 的代码?
  • 我不确定为什么这是一个公认的答案。验证和设置令牌的工作由 CSRFFilter 而不是存储库完成。任何需要 Nonce 令牌的人都必须为 CSRF 添加自定义过滤器
【解决方案2】:

我已经实现了一个自定义 csrf 令牌存储库,它为每个 http POST/DELETE 请求生成一个新令牌。我不认为应该为http GET更新令牌,如果你查看spring CsrfFilter类的源代码,它有一个内部类DefaultRequiresCsrfFilter,它通过GET方法的令牌检查。

自定义csrf令牌仓库需要实现接口CsrfTokenRepository。实际上我已经重用了 HttpSessionCsrfTokenRepository 的大部分代码,这是 spring 默认的。需要自定义实现的函数是loadToken()

/*Customized loading token function, which invalidate the CSRF token once it is consumed. A new token is generated on next http req.*/

    public CsrfToken loadToken(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        CsrfToken token = session == null ? null : (CsrfToken)session.getAttribute(this.sessionAttributeName);
        if (/*HERE http request can be checked to see if it is a POST/DELETE */) {
            if (session != null) {
                //Remove the old token from session, and new token will be generated for next req 
                session.removeAttribute(DEFAULT_CSRF_TOKEN_ATTR_NAME);
            }
        }
        return token;
    }

并且要加载自定义 csrf 令牌存储库,需要在 security.xml 中进行配置,如上面的答案中所述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-25
    • 2013-10-02
    • 1970-01-01
    • 2016-11-04
    • 2018-11-22
    • 2014-01-06
    • 2013-04-25
    • 2016-06-21
    相关资源
    最近更新 更多