我正在尝试在现有应用程序中实现CSRF保护。我们在后端有Spring MVC,在前端有HTML,CSS和Apache Velocity模板的混合。
我尝试过配置Spring CSRF功能,如下所示 - https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html。阅读完Spring文档后,我觉得在配置完成后,Spring Security会自动发送包含所有请求的令牌,但在我的情况下并没有发生 - 可能是我的配置出了问题。
作为替代方案,我正在创建一个Spring Security的CsrfTokenRepository
实例,并在我的前端控制器上调用generateToken
和loadToken
方法拦截所有即将发出的HTTP请求到服务器。这样,我就可以为每个HTTP请求提供一个新令牌,然后在下一个请求中将其发回。
如果我过于频繁地点击页面中的不同链接,则机制会失败 - 在呈现页面并且新标记设置在隐藏字段中时,浏览器已经向具有旧标记的另一页面发送了请求。当我打开多个选项卡时它也会失败,因为最新打开的选项卡收到的令牌会从之前打开的选项卡中获胜。
为了克服这个问题,我更改了仅在每个会话中生成的标记。但是,现在我冒着令牌暴露的风险 - 例如通过get request或referrer字段。有没有办法提高每个请求令牌的性能?或者使用每个会话令牌使方法更安全?