spring:省略get表单的csrf标记?

gev0vcfq  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(307)

使用springsecurityweb3.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请求)。

hzbexzde

hzbexzde1#

csrfrequestdatavalueprocessor.java中的代码应该省略get forms的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

相关问题