跨站请求伪造攻击CSRF
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
跨站
在其他网站,在用户不知情的情况下,对目标网站发出了请求,产生了影响。
CSRF攻击攻击原理及过程
- 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
 - 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
 - 用户在同一浏览器中,打开一个TAB页访问了攻击网站B;
 - 攻击网站就能伪装成用户C向A网站发起请求(此时携带了用户的身份信息Cookie)
 
CSRF攻击特征
- 攻击网站B向A网站发起请求
 - 携带A网站的Cookie
 - 不访问A网站前端
 - HTTP请求头的refer指向攻击网站B
 
CSRF攻击危害
- 利用用户登录态
 - 用户不知情
 - 完成业务请求
 - 盗取用户资金(转账,消费)
 - 冒充用户发帖背锅
 - 损坏网站声誉
 - 等等…
 
CSRF攻击防御
- 通过SameSite Cookie,禁止第三方网站携带Cookie
 - 不访问A网站前端,在A网站前端中加入验证信息,第三方攻击网站无法获取验证信息,后台通过判断验证信息处理请求
- 验证码,(图形验证码)缺点是用户体验差
- svg-captcha:Node 图形验证码
 
 - Token:Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位
 
 - 验证码,(图形验证码)缺点是用户体验差
 - 验证HTTP请求头的refer 请求来源,如果不是合法的域名直接拒绝请求
 - 防抓包:使用HTTPS(HTTPS 还是通过了 HTTP 来传输信息,但是信息通过 TLS 协议进行了加密。)替换HTTP,对传输的数据进行加密,这样,当请求的信息被抓包工具抓包后,也无法修改提交的数据。
 - node可以使用 CSRF 中间件来防御csrf攻击。
 
SameSite Cookie
服务器端设置Cookie的 SameSite,浏览器端在跨站请求时Cookie不会被发送,从而可以阻止跨站请求伪造攻击(CSRF)。目前主流浏览器基本上都支持。支持情况
1  | Set-Cookie: key=value; SameSite=Strict  | 
SameSite属性值
- Strict:跨域发起的任何请求都不会携带cookie
 - Lax: Lax相对于Strict模式来说,宽松了一些
 
| 请求类型 | 例子 | 非 SameSite | SameSite = Lax | SameSite = Strict | 
|---|---|---|---|---|
| link | <a href="…"> | 
Y | Y | N | 
| prerender | <link rel="prerender" href="…"> | 
Y | Y | N | 
| form get | <form method="get" action="…"> | 
Y | Y | N | 
| form post | <form method="post" action="…"> | 
Y | N | N | 
| iframe | <iframe src="…"> | 
Y | N | N | 
| ajax | $.get('…') | 
Y | N | N | 
| image | <img src="…"> | 
Y | N | N |