【问题标题】:Spring: Omit CSRF token for GET forms?Spring:省略 GET 表单的 CSRF 令牌?
【发布时间】:2021-04-24 01:54:31
【问题描述】:

使用 spring-security-web 3.2.x(旧客户端代码),有没有办法不将 csrf 令牌参数注入使用 GET 方法的表单中?

这使得提交表单时令牌出现在 URL 中并且可能被泄露。

配置是:

<http>
    <csrf>

JSP 是:

<form:form method="GET" ...

生成的 HTML:

    <input type="hidden" name="_csrf" value="********-****-****-****-******" />
</form>

注意使用:

<csrf request-matcher-ref="csrfMatcher"/>

没有帮助,因为这只控制在提交表单时是否检查 csrf 令牌,而不是控制是否将 csrf 隐藏字段注入到表单中。 (默认情况下不检查 GET 请求)。

【问题讨论】:

    标签: spring spring-security


    【解决方案1】:

    CsrfRequestDataValueProcessor.java 中有代码应该省略 GET 表单的 CSRF 令牌:

    private Pattern DISABLE_CSRF_TOKEN_PATTERN = Pattern.compile("(?i)^(GET|HEAD|TRACE|OPTIONS)$");
    
    public String processAction(HttpServletRequest request, String action, String method) {
        if(method != null && DISABLE_CSRF_TOKEN_PATTERN.matcher(method).matches()) {
            request.setAttribute(DISABLE_CSRF_TOKEN_ATTR, Boolean.TRUE);
        } else {
            request.removeAttribute(DISABLE_CSRF_TOKEN_ATTR);
        }
        return action;
    }
    

    但是根据代码检查和调试,它永远不会被调用。可能是一个错误。

    这是 spring-security-web-3.2.7 和 spring-webmvc-3.2.13

    【讨论】:

      猜你喜欢
      • 2019-12-06
      • 2017-06-16
      • 2012-12-15
      • 2013-12-02
      • 2019-07-01
      • 2016-12-16
      • 2011-12-11
      • 1970-01-01
      • 2017-09-07
      相关资源
      最近更新 更多