我可以使用 JWT 作为反 CSRF 令牌吗

Posted

技术标签:

【中文标题】我可以使用 JWT 作为反 CSRF 令牌吗【英文标题】:Can I use a JWT as an anti-CSRF Token 【发布时间】:2021-04-21 08:23:47 【问题描述】:

我想看看我是否可以在不必在服务器上的 redis 中的用户会话中存储任何其他信息的情况下完成防止 CSRF。在请求删除帐户的表单后,我是否可以使用随机字符串 (uuid4) 签署 JWT 令牌,并使用过期时间保密并将结果发送给客户端。提交表单后,我将验证 JWT。

类似这样的:

const tokenToSend = jwt.sign(uuid4(), SECRET,  expire: 60 )

【问题讨论】:

您的 jwt.sign 函数是否更新或添加 JWT 在其签名之前时间戳?如果不是,那么您的想法实际上对安全性很不利,因为每个用户的所有 CSRF 令牌都是相同的。 如果你使用的是 REST API 和 content-type: Application/Json 或者一些非简单的内容类型,那么你可能不需要实现 CSRF 保护。您可以使用 CORS (developer.mozilla.org/en-US/docs/Web/HTTP/CORS) @Cyber​​Srikanth 当我们现在拥有 CORS 和同站点 cookie 时,您会说 CSRF 令牌已成为过去吗? @Numnumberry 这取决于...例如,如果您尝试从不同的站点(不允许来源的站点)提交表单数据,CORS 将阻止 javascript 读取响应,但它不会阻塞请求(请求仍然可以成功)并且有可能进行 CSRF 攻击。您可以用 CORS 替换 CSRF 令牌,但并非总是如此,这取决于您的用例。您不应接受简单的内容类型,例如 application/x-www-form-urlencoded,而仅使用 application/json 之类的类型,这需要在飞行前调用 OPTIONS 以确保允许此方法。 @Numnumberry 我不确定,希望对您有所帮助 (cyber-srikanth.blogspot.com/2020/08/…) 【参考方案1】:

描述 Csrf 攻击的一种简单方法是,受害者(登录了易受攻击的网站 A)浏览了第三个网站 B,该网站向网站 A 发出了伪装成受害者的请求。 因此,为了防止 csrf 攻击,我们必须将(我们想要保护的)请求设置为不可预测,以便攻击者无法在之前准备请求。如果你使用 jwt 作为 csrf 令牌,你必须使这个 jwt 对每个请求都是唯一的。

【讨论】:

以上是关于我可以使用 JWT 作为反 CSRF 令牌吗的主要内容,如果未能解决你的问题,请参考以下文章

如果使用 JWT,我需要 CSRF 吗?

可以使用(加密强)会话 cookie 作为 CSRF 令牌吗?

JWT 在未经身份验证的端点上进行 CSRF 保护?

CSRF:我可以使用 cookie 吗?

使用 JWT 令牌的 jti 声明作为不透明令牌

JWT + cookie + HTTPS + CSRF