我可以使用 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)
@CyberSrikanth 当我们现在拥有 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 令牌吗的主要内容,如果未能解决你的问题,请参考以下文章