CSRF
Cross-Site request forgery,跨站请求伪造:攻击者诱导受害者进⼊恶意⽹站,在第三⽅⽹站中,向被攻击⽹站发送跨站请求。利⽤受 害者在被攻击⽹站已经获取的注册凭证,绕过后台的⽤户验证,达到冒充⽤户对被攻击的⽹站执⾏某项操作的⽬的。
攻击步骤:
- 受害者登录 a.com,并且保留了登录凭证 cookie
- 攻击者诱导受害者访问 b.com
- b.com 向 a.com 发送请求,a.com/xxxx,浏览器就会直接带上 a.com 的 cookie
- a.com 收到了请求,验证通过后,执行相应操作
- 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让 a.com 执行了自己定义的操作
攻击类型
GET 型:如在⻚⾯的某个 img 中发起⼀个 get 请求
POST 型:通过⾃动提交表单到恶意⽹站
如何防范
CSRF 一般发生在第三方域名,攻击者无法获取到 cookie 信息,只是利用浏览器机制使用 cookie
同源策略
通过检查 request header 中的 origin、referer、host 等,判断请求站点是否是自己允许的站点。
- host:任何请求携带,域名和端口号
- origin:一般存在于跨域请求中,协议和域名,和 Access-Control-Allow-Origin 一起存在
- referer:告知服务器原始 url,其用于所有类型的请求,并且包括:协议+域名+查询参数
Referrer-Policy:可设置携带 referer 头,eg:Referrer-Policy: no-referrer | same-origin 等。
Cookie SameSite
- Strict:完全禁止第三方 cookie,⽐如 a.com 的⻚⾯中访问 b.com 的资源,那么 a.com 中的 cookie 不会被发送到 b.com 服务 器,只有从 b.com 的站点去请求 b.com 的资源,才会带上这些 Cookie
- Lax:在跨站点的情况下,从第三⽅站点链接打开和从第三⽅站点提交 Get ⽅式的表单这两种⽅式都会携带 Cookie。但如果在第三 ⽅站点中使⽤ POST ⽅法或者通过 img、Iframe 等标签加载的 URL,这些场景都不会携带 Cookie
- None:任何情况下都会发送 Cookie 数据
CSRF Token:提交请求时携带额外信息
- 用户打开页面的时候,服务器生成一个 token
- 每次页面加载的时候,加到所有的能发请求的 html 元素上, ⽐如 form, a
- 每次前端发起请求, 都携带 Token 参数
- 服务端每次接收请求, 都校验 Token 的有效性