Spring:以编程方式生成新的 csrf 令牌

Posted

技术标签:

【中文标题】Spring:以编程方式生成新的 csrf 令牌【英文标题】:Spring: Generate new csrf token programmatically 【发布时间】:2015-06-25 17:35:17 【问题描述】:

我正在尝试制作一个在单个 html 页面上运行的 web 应用程序,它允许用户通过 javascript 和 ajax 与服务器进行交互。我想通过在每个请求中包含一个 csrf 令牌来使我的请求免受 csrf 攻击。

因为我的 webapp 只能在单个页面上运行,所以我不能在视图中使用 $_csrf.token(或类似的东西)语法,因为视图将是一个 json 对象。相反,我想要一个像“/security/csrf”这样的url,它返回一个与用户会话关联的令牌。 (是的,这不会完全是一项宁静的服务。)

我有什么方法可以生成一个 csrf 令牌,Spring Security 在验证登录时可以访问该令牌?另外,以这种方式使用 csrf 令牌是否存在缺陷?

【问题讨论】:

每个请求的令牌将终止缓存。每个会话的令牌同样安全。在您的第一个 html 响应中,将 csrf 令牌包含在元标记中,就像文档说的那样:docs.spring.io/spring-security/site/docs/current/reference/html/… 所以如果我每次会话只使用一个令牌,Spring 会继续在多个请求中接受相同的令牌吗? @NeilMcGuigan 是的,您可以跨请求(在同一个会话中)使用相同的令牌。 好的,谢谢!我会试试这个方法! 如果我想在每个新请求时更改令牌值,那么由于我不想重复令牌值,如果有人抓住我的令牌值,那么他们可以访问我的请求,所以请帮助我或建议我是正确的一种方法。 【参考方案1】:

每个请求的令牌将终止缓存。每个会话的令牌同样安全。

在您的第一个 html 响应中,将 csrf 标记包含在元标记中,就像文档说的那样:http://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html#csrf-include-csrf-token-ajax

您可以跨请求(在同一个会话中)使用相同的令牌

【讨论】:

以上是关于Spring:以编程方式生成新的 csrf 令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何生成和验证 csrf 令牌

Spring Security 在登录响应中使用新的会话令牌设置 CSRF

Laravel 4.2 根据请求频率生成新的 CSRF 令牌?

尽管以表单形式发送 CSRF 令牌,但不支持 Spring Security CSRF 405 方法 POST

如何在不使用 @EnableWebMvcSecurity 的情况下在 spring security / thymeleaf 中自动生成 csrf 令牌

Spring Security 未创建 CSRF 令牌