【面试补缺(3)】ANTI CSRF TOKEN具体过程

Anti CSRF Token作为防止CSRF攻击的主要防御方案之一,攻击原理在这里就不再多作介绍,这篇文章主要研究下Anti CSRF Token生成的原理和实例。

什么是CSRF Token防范方案

Anti CSRF Token作为有效的防止CSRF攻击的方案,前端需要有所了解。

具体流程

  1. 服务器发送给客户端一个token。
  2. 客户端提交的表单中带着这个token。
  3. 如果这个token不合法,那么服务器拒绝这个请求。

防范方式

通常来说,对于 CSRF 攻击有一些通用的防范方案,简单的介绍几种常用的防范方案:

  • Synchronizer Tokens:通过响应页面时将 token 渲染到页面上,在 form 表单提交的时候通过隐藏域提交上来。
  • Double Cookie Defense:将 token 设置在 Cookie 中,在提交 post 请求的时候提交 Cookie,并通过 header 或者 body 带上 Cookie 中的 token,服务端进行对比校验。
  • Custom Header:信任带有特定的 header(例如 X-Requested-With: XMLHttpRequest)的请求。这个方案可以被绕过,所以 rails 和 django 等框架都放弃了该防范方式。

那么Token怎么来的呢

聊到我们的主要话题,可以先来看一下Token的结构:

1
2
3
4
5
-------------------------------------------------------------------------------------
| msg | separator | signature |
-------------------------------------------------------------------------------------
| key | timestamp | . | Base64(sha256(msg)) |
-------------------------------------------------------------------------------------

主要由三部分组成:

  1. msg:由随机字符和有效时间戳组成
  2. 分隔符号:用来分隔msg和signature部分,这里用的是.
  3. 签名(signature):对msg部分进行特性算法的加密所得

具体流程

  1. 根据算法服务端将token放置在cookie中传递给客户端
  2. 客户端提交请求的时候从cookie中读取到token。(因为CSRF跨站的伪造只能伪造带有目标站点cookie的请求,但是不能通过JS读取得到)
  3. 服务端校验传过来的token跟cookie(或者更安全的是Session)中的token是否一致,一致则是合法请求。