jwt 怎么防止 csrf

HongHaiyang
  • 104

小弟我最近看了 jwt 的使用,在自己写的小项目里也用了 jwt 作为单点登录验证等,后端是 nodejs。我想到了 csrf,csrf 和 jwt 的原理我也知道的差不多了,但是我的疑惑是采用 JWT 的形式可以防止 CSRF 吗? 我现在用 postman 去请求我的接口,如果 postman 的 header 里面不放我的 token(这个 token 是我现在开发的页面正常登陆上去后端返回到前端的 token) 的话确实显示的是 token 不存在不返回数据。 但我在浏览器的 localStorage 里面把我存的 token 拷出来放在 postman header 里面去请求,就成功了。那岂不是 jwt 防不了 CSRF 吗,存在前端的 token 谁都可以拿呀,拿了之后带着请求岂不是就ok 了?

这个问题真的很困扰我,请各位大哥不吝赐教~

回复
阅读 5.6k
2 个回答

你是不是对CSRF和JWT有什么误解。

JWT只是一个身份验证的凭证,和你用去防范CSRF并不矛盾,你完全可以在JWT之上加上防范CSRF的措施,比如检查Referer字段和添加校验token(即CSRF Token)。

检查Referer字段

HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer字段应和请求的地址位于同一域名下。以上文银行操作为例,Referer字段地址通常应该是转账按钮所在的网页地址,应该也位于www.examplebank.com之下。而如果是CSRF攻击传来的请求,Referer字段会是包含恶意网址的地址,不会位于www.examplebank.com之下,这时候服务器就能识别出恶意的访问。

这种办法简单易行,工作量低,仅需要在关键访问处增加一步校验。但这种办法也有其局限性,因其完全依赖浏览器发送正确的Referer字段。虽然http协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其Referer字段的可能。

添加校验token

由于CSRF的本质在于攻击者欺骗用户去访问自己设置的地址,所以如果要求在访问敏感数据请求时,要求用户浏览器提供不保存在cookie中,并且攻击者无法伪造的数据作为校验,那么攻击者就无法再执行CSRF攻击。这种数据通常是表单中的一个数据项。服务器将其生成并附加在表单中,其内容是一个伪乱数。当客户端通过表单提交请求时,这个伪乱数也一并提交上去以供校验。正常的访问时,客户端浏览器能够正确得到并传回这个伪乱数,而通过CSRF传来的欺骗性攻击中,攻击者无从事先得知这个伪乱数的值,服务器端就会因为校验token的值为空或者错误,拒绝这个可疑请求。
止痛药
  • 1
新手上路,请多包涵

您好,根据我个人的理解,CSRF攻击的大前提是攻击者获取不到用户的cookie,但是通过恶意链接诱使用户通过攻击者的链接提交请求给相关接口,cookie的值是默认携带的,而jwt的值需要通过前端页面的js代码提取出并主动提交给后端进行验证,而攻击者获取不到用户的jwt,更无法通过js的方式将它取出来,因此jwt可以防止CSRF攻击。
简单来说,CSRF攻击意味着请求没有来自正确的前端页面,而jwt需要前端主动将它取出。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏