【SpringSecurity系列(十九)】Spring Security 中 CSRF 防御源码解析
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
《深入浅出Spring Security》一书已由清华大学出版社正式出版发行。在本文中,作者继续探讨Spring Security的CSRF防御机制,尤其是其源码实现。这是Spring Security系列文章的第19篇,建议读者阅读前面的系列文章以便更好地理解本文内容。
CSRF参数的生成和校验
文章首先介绍了CSRF防御机制中_csrf参数的生成和校验过程。生成_csrf参数的过程利用了Spring Security中的CsrfToken接口和其实现类DefaultCsrfToken,以及CsrfTokenRepository接口,其中包括生成Token、保存Token和加载Token的方法。默认情况下,使用HttpSessionCsrfTokenRepository存储_csrf参数,而在前后端分离的情况下使用CookieCsrfTokenRepository。
1.随机字符串生成
生成_csrf参数的过程涉及到CsrfTokenRepository接口的generateToken、saveToken和loadToken方法。在默认的HttpSessionCsrfTokenRepository实现中,CsrfToken存储在HttpSession中,而在CookieCsrfTokenRepository实现中则存储在Cookie中。
2.参数校验
参数的校验是通过CsrfFilter的doFilterInternal方法进行的。该方法首先尝试从HttpSession或Cookie中加载CsrfToken,如果请求是第一次则生成并保存CsrfToken。然后,过滤器检查请求方法是否需要CSRF防御,并从请求中获取_csrf参数,与加载的CsrfToken进行比较。如果两者不同,则抛出异常。
3.LazyCsrfTokenRepository
除了前面介绍的两个CsrfTokenRepository实现外,还有一个LazyCsrfTokenRepository,它作为代理增强了HttpSessionCsrfTokenRepository或CookieCsrfTokenRepository的功能。该实现延迟保存CsrfToken,直到实际需要时才进行保存,从而节省存储空间。默认情况下,Spring Security将使用LazyCsrfTokenRepository和HttpSessionCsrfTokenRepository的组合。
4.小结
文章总结了Spring Security中CSRF防御的原理,主要包括生成并保存csrfToken,以及在请求到来时提取并比较csrfToken以验证请求的合法性。作者还提供了微信群组信息,以供读者进一步讨论和学习Web安全。
想要了解更多内容?