对于提交表单的某个应用程序,我需要一个 CSRF 令牌POST
。理想情况下,我不想为每次提交进行数据库调用,以避免存储和数据库流量和延迟。为此,OWASP 的“CSRF 预防备忘单”说,
概述
加密令牌模式利用加密而非比较令牌验证方法。成功认证后,服务器使用仅在服务器上可用的唯一密钥生成由用户 ID、时间戳值和随机数组成的唯一 Token。此 Token 返回给客户端并嵌入到隐藏字段中。[…] 基于非 AJAX 表单的请求将隐式地将令牌保留在其隐藏字段中。收到此请求后,服务器使用用于创建 Token 的相同密钥读取和解密 Token 值。[…]
验证
在成功的令牌解密后,服务器可以访问解析的值,理想情况下以声明的形式。
对我来说,“验证”的第一行就像JWT的定义一样。我也不明白为什么需要加密令牌中的信息:看起来它只需要验证它来自服务器(而不是攻击者试图伪造 CSRF 令牌。)
加密 CSRF 令牌有什么特别的原因吗?如果没有,JWT 就足够了吗?
此外,上述令牌模式包括随机数。随机数的意义何在?(这个模式的重点是不存储任何状态服务器端。如果我不存储状态,我如何在验证期间以任何实质性方式使用随机数?)
我在这里追求 JWT 的主要原因是有不错的库支持,我可能迟早会想要它们进行身份验证,而且它主要让我远离实现加密的东西。
我对 JWT 的理解是,如果我有用于完整用户身份验证的 JWT,我可以将它们存储在 中localStorage
,并在提交表单之前简单地将它们添加到带有 JS 的字段中。不幸的是,该应用程序使用基于 cookie 的身份验证,我现在无法更改该方面。