spring 安全性中每个请求的 CSRF 令牌
CSRF token per request in spring security
如何在 spring 安全 3 中实现每个请求的 csrf。2.Currently 它是按会话处理的。这是必须的要求
请post需要执行的更改。
在securitycontext.xml
<http>
<csrf />
</http>
已给出且应用程序在每个会话中使用令牌
您可以更改 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 令牌存储库,它为每个 http POST/DELETE 请求生成一个新令牌。我认为不应该为 http GET 更新令牌,如果你查看 spring CsrfFilter class 的源代码,它有一个内部 class 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 中进行配置,如上面的答案所述。
如何在 spring 安全 3 中实现每个请求的 csrf。2.Currently 它是按会话处理的。这是必须的要求
请post需要执行的更改。
在securitycontext.xml
<http>
<csrf />
</http>
已给出且应用程序在每个会话中使用令牌
您可以更改 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 令牌存储库,它为每个 http POST/DELETE 请求生成一个新令牌。我认为不应该为 http GET 更新令牌,如果你查看 spring CsrfFilter class 的源代码,它有一个内部 class 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 中进行配置,如上面的答案所述。