(1)概念
CSRF
攻击指的是
跨站请求伪造攻击
,攻击者诱导⽤户进⼊⼀个第三⽅⽹站,然后该⽹站向被
攻击⽹站发送跨站请求。如果⽤户在被攻击⽹站中保存了登录状态,那么攻击者就可以利⽤
这个登录状态,绕过后台的⽤户验证,冒充⽤户向服务器执⾏⼀些操作。
CSRF
攻击的
本质是利⽤
cookie
会在同源请求中携带发送给服务器的特点,以此来实现⽤户
的冒充。
(2)攻击类型
常见的
CSRF
攻击有三种:
1.GET 类型的
CSRF
攻击,⽐如在⽹站中的⼀个
img
标签⾥构建⼀个请求,当⽤户打开这
个⽹站的时候就会⾃动发起提交。
2.POST 类型的
CSRF
攻击,⽐如构建⼀个表单,然后隐藏它,当⽤户进⼊页⾯时,⾃动
提交这个表单。
3.链接类型的 CSRF
攻击,⽐如在
a
标签的
href
属性⾥构建⼀个请求,然后诱导⽤户去点
击。
(3)如何防御CSRF攻击?
CSRF
攻击可以使⽤以下⽅法来防护:
1. 进⾏同源检测 ,服务器根据 http
请求头中
origin
或者
referer
信息来判断请求是否为允
许访问的站点,从⽽对请求进⾏过滤。当
origin
或者
referer
信息都不存在的时候,直接
阻⽌请求。这种⽅式的缺点是有些情况下
referer
可以被伪造,同时还会把搜索引擎的链
接也给屏蔽了。所以⼀般⽹站会允许搜索引擎的页⾯请求,但是相应的页⾯请求这种请
求⽅式也可能被攻击者给利⽤。(
Referer
字段会告诉服务器该⽹页是从哪个页⾯链接过
来的)
2.使⽤ CSRF Token
进⾏验证 ,服务器向⽤户返回⼀个随机数
Token
,当⽹站再次发起请
求时,在请求参数中加⼊服务器端返回的
token
,然后服务器对这个
token
进⾏验证。这
种⽅法解决了使⽤
cookie
单⼀验证⽅式时,可能会被冒⽤的问题,但是这种⽅法存在⼀
个缺点就是,我们需要给⽹站中的所有请求都添加上这个
token
,操作⽐较繁琐。还有⼀
个问题是⼀般不会只有⼀台⽹站服务器,如果请求经过负载平衡转移到了其他的服务
器,但是这个服务器的
session
中没有保留这个
token
的话,就没有办法验证了。这种情
况可以通过改变
token
的构建⽅式来解决。
3.对 Cookie
进⾏双重验证 ,服务器在⽤户访问⽹站页⾯时,向请求域名注⼊⼀个
Cookie
,内容为随机字符串,然后当⽤户再次向服务器发送请求的时候,从
cookie
中取
出这个字符串,添加到
URL
参数中,然后服务器通过对
cookie
中的数据和参数中的数
据进⾏⽐较,来进⾏验证。使⽤这种⽅式是利⽤了攻击者只能利⽤
cookie
,但是不能访
问获取
cookie
的特点。并且这种⽅法⽐
CSRF Token
的⽅法更加⽅便,并且不涉及到分
布式访问的问题。这种⽅法的缺点是如果⽹站存在
XSS
漏洞的,那么这种⽅式会失效。
同时这种⽅式不能做到⼦域名的隔离。
在设置
cookie
属性的时候设置
Samesite
,限制
cookie
不能作为被第三⽅使⽤ ,从⽽可
以避免被攻击者利⽤。
Samesite
⼀共有两种模式,⼀种是严格模式,在严格模式下
cookie
在任何情况下都不可能作为第三⽅
Cookie
使⽤,在宽松模式下,
cookie
可以被请
求是
GET
请求,且会发⽣页⾯跳转的请求所使⽤。