什么是CSRF攻击?如何防御?
1. 什么是 CSRF
2. CSRF 原理
3. CSRF 防御
答:
CSRF(Cross-site request forgery)跨站请求伪造。
你可以这么理解 CSRF 攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF 能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。
要完成一次 CSRF 攻击,受害者必须依次完成两个步骤:
- 登录受信任网站 A,并在本地生成 Cookie。
- 在不登出 A 的情况下,访问危险网站 B。
如果网站 A 允许使用 GET 方式请求更新资源,那么在用户登录网站 A 后,B 可以通过 <img> 以 GET 的方式请求第三方资源(指 A),所以你的浏览器会带上你的 A 的 Cookie 发出 Get 请求。
CSRF 攻击是源于 WEB 的隐式身份验证机制!WEB 的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的!
CSRF 攻击有以下几个关键点。
在服务端进行 CSRF 防御
目标网站 A 和恶意网站 B 发出的请求中,请求头唯一的不同就是 Referer 字段。通常来说,Referer 字段通常与 Host 字段的域名是一样的。根据 Referer 字段与 Host 字段在同一域名下的规则,可以检测 Referer 字段值,如果发现其与 Host 值不在同一域名下,这时候服务器就能够识别出恶意的访问了。
如果要求在访问敏感数据请求时,要求用户浏览器提供不保存在 cookie 中,并且攻击者无法伪造的数据作为校验,那么攻击者就无法再执行 CSRF 攻击。这种数据通常是表单中的一个数据项。服务器将其生成并附加在表单中,其内容是一个随机数。即 <input type="hidden" name="_csrf_token" value="xxxx"> 的形式。
当客户端通过表单提交请求时,这个随机数也一并提交上去以供校验。
补充
补充:CSRF 的本质是"借你的 Cookie 干坏事",防御的核心是让攻击者拿不到或用不了那个用于校验的凭据。
三种主流防御手段
-
SameSite Cookie:把
Set-Cookie加上SameSite=Lax或Strict,跨站请求不再自动带上 CookieSet-Cookie: sid=xxx; SameSite=Lax; Secure; HttpOnly -
CSRF Token:服务端下发随机 token,前端在请求里带上,攻击者无法预知
<form> <input type="hidden" name="_csrf_token" value="随机字符串"> </form> -
校验 Referer / Origin:合法请求的 Referer 一定来自本站
实践建议
- 现代浏览器 + HTTPS 环境下,
SameSite=Lax已经能挡住绝大多数 CSRF - 涉及转账、改密等敏感操作,必须再叠一层 token 校验
- 不要用 GET 请求做"写"操作(GET 应该是幂等的)
来源整理自:我的有道云笔记


