CSRF的token是怎么生成的?

不是很清楚防御csrf攻击的流程
尤其是token是怎么生成的?为什么前后端会对应的上?是不是还要一个请求让后端把每次不同的token给前端?

阅读 9.8k
2 个回答

CSRF token的生成,下发,上送,校验

1. 生成

  1. 由服务端生成随机唯一的字符串(GUID, UUID等),并保存到服务端的session或者其他服务端缓存(如Redis);
  • token的缓存最好有过期时间;
  1. 如果希望提高token的安全性可以对生成的token进行对称加密

2. 下发

下发是服务端如何把生成的CSRF token传给客户端,方式很多了,看客户端怎么方便提取并传给后端。

  1. 千万别千万别千万别通过Set-Cookie下发;
  2. 喷到页面里作为约定的全局变量;
  3. 最好和后端一起确定一个标准的下发和上送方式。

3. 上送

上送:是客户端调用接口时提取CSRF token并传给服务。看请求接口类型也后很多上送方式。

  1. 针对GET请求可以放入queryString里;
  2. Form POST请求可以添加隐藏域;
  3. AJAX, fetch请求还可以采用放入request header里;
  4. 最好和后端一起确定一个标准的上送方式。

4. 校验

  1. 服务端从请求里获取客户端上送的token
  2. 解密(如果之前有加密的话);
  3. 再跟从Seesion获取缓存的值对比。

摘自gitHub笔记

随机生成。


啥叫“前后端对应上”?

利用 Token 来防御 CSRF 的往往是前后端不分离的站点,服务端渲染的时候就已经带着 Token 了,返回给浏览器即可。浏览器提交表单时原样传回这个 Token,服务端比对一下是不是之前下发过的就行。

但如果是前后端分离的,没必要这么做啊,多个接口返回的话反倒增加了 XSS 的风险啊。要么直接 Samesite Cookie 了,要么比对 Origin/Referrer 就行了啊。

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