1. CSRF 是什么?
- 跨站请求伪造 Cross-site request forgery
- 伪造真实用户身份,对程序进行恶意攻击。
- 解释: 用户身份是好的, 但是某人获取到了该信息后,借用真实好身份去做坏事儿。
2. 攻击流程
例子:
1. 一家银行的转账地址为: www.a.com/withdraw?from=A&to=B&amount=1000
2. 一个攻击者在www.b.com 放置代码为: <img src="www.a.com/withdraw?from=A&to=B&amount=1000" />
例如A用户刚给B转完账,登录状态还没有失效,如果www.a.com没有安全措施,可能会让A损失1000元
所以就是: CSRF 不能获取 用户任何信息,但是是欺骗浏览器,以用户名义来访问
CSRF通常是跨域的,img标签, a标签等外域都可能被攻击者掌控。
浏览器打开A网站
页面发起请求
1. 当前页面的请求
- img
- js
- link
- iframe
- 接口请求等
2. 会改变当前页面,可能打开别的页面
- a tag
- location.href
- window.open()
3. CSRF 特点
- 发生在第三方域名
- 获取到cookie信息 ❌ 应该是 【以用户名义来访问,不是获取】✅。
4. [1] 同源验证 (来源域名检测) - 请求头referer/origin校验
- 既然CSRF大多来自第三方网站,那么我们就直接禁止外域(或者不受信任的域名)对我们发起请求。
- 来源域名的检查
HTTP: header Referer / Origin 标记请求来源。
从google地址: https://www.google.com.hk/search?q=%E7%9F%A5%E4%B9%8E&oq=%E7%9F%A5%E4%B9%8E&aqs=chrome.0.69i59j0j69i61l3j69i65l3.1864j0j7&sourceid=chrome&ie=UTF-8
访问知乎
Referer值为Host 可以不带Path
同源验证是一个相对简单的防范方法,能够防范绝大多数的CSRF攻击。
4. [2] CSRF TOKEN
对于敏感信息获取或请求时候,如何做身份的校验?
- cookie 设置,samesite设置下,【只允许同源发送cookie】。
- 将token写在session里面。
- 发送请求,带上这个token,验证传来的token 和 服务器上的token 是否一致。
- Token = useid + 时间戳 + 随机数 => 加密 => token