NOTE
1.8 CSRF
CSRF 的原理、同源策略关系与防御。
这是历史学习笔记,可能存在过时或不完整的理解。
1. CSRF攻击是什么
一种Web攻击 比如淘宝付款是get请求 用户登陆了淘宝,获取了cookie保存在本地。 用户访问了危险网站,危险网站发送了一个get请求到淘宝付款链接。 浏览器会带上淘宝的cookie去访问淘宝付款链接 ok,最后真的付款了
2. 为什么有跨域限制还会发生CSRF
- 同源策略对cookie的限制只是针对js,不能读写非同源的cookie。但是无论是否同源,浏览器都会带上相应的cookie访问服务器。
- 同源策略允许跨域提交表单
3. 如何防止CSRF攻击
token校验。步骤如下:
- 前端请求后端
- 后端生成唯一的token保存起来,并返回给前端,有两种方式
- 把token渲染到html中。
- 把token写到cookie中。
- 前端取出token拼接到请求参数中访问后端,有两种方式
- js DOM操作取出html中的token(同源策略会限制脚本 API 操作)
- js读取cookie中的token(同源策略限制 cookie 操作)
- 后端从请求参数中取出token,检验token一致性
4. 实例
4.1. CSRF Filter
- 前端使用js从cookie中读取
session_cookie(登录态),计算csrf_token,放入http url参数中 - 后端从http url参数中取出
csrf_token,然后从cookie中读取session_cookie(登录态),计算csrf_token,对比两个token是否一致
可以看出csrf_token在每个用户登录周期内是唯一的,但是不是每个请求唯一的。这个token一旦泄露仍有风险,比如通过referrer外泄,所以得加上以下代码:
<meta name="referrer" content="origin">
讨论
使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看