Anti CSRF Token作为防止CSRF攻击的主要防御方案之一,攻击原理在这里就不再多作介绍,这篇文章主要研究下Anti CSRF Token生成的原理和实例。
什么是CSRF Token防范方案
Anti CSRF Token作为有效的防止CSRF攻击的方案,前端需要有所了解。
具体流程
- 服务器发送给客户端一个token。
- 客户端提交的表单中带着这个token。
- 如果这个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)) |
-------------------------------------------------------------------------------------
主要由三部分组成:
- msg:由随机字符和有效时间戳组成
- 分隔符号:用来分隔msg和signature部分,这里用的是
.
- 签名(signature):对msg部分进行特性算法的加密所得
具体流程
- 根据算法服务端将token放置在cookie中传递给客户端
- 客户端提交请求的时候从cookie中读取到token。(因为CSRF跨站的伪造只能伪造带有目标站点cookie的请求,但是不能通过JS读取得到)
- 服务端校验传过来的token跟cookie(或者更安全的是Session)中的token是否一致,一致则是合法请求。