一、简介
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
二、基本原理
CSRF攻击流程图如下:
三、防御
1. token 校验(常用)
前后端一起协作。前端将cookie的一个值(如user_key)进行加密后发送到后台,后天收到cookie后以相同的加密算法进行加密,若两者相等则请求成功。(因为CSRF是跨域请求,跨域无法拿到本域的cookie,所以无法伪造)
2. 使用验证码
因为CSRF是在用户不知情的情况下伪装成用户发送请求的。因此在用户发送请求之后设置需使用验证码验证,验证通过才请求成功,这样用户在不小心点开恶意链接遭到CSRF攻击后便会弹出验证码端口,使用户察觉。(不过使用验证码影响用户体验,因此一般不被考虑。我们经常看见的验证码是为了防御DDOS而设置的)
3. 使用referer验证
referer一般为当前网站的站点(如在百度的话referer就是www.baidu.com),将请求发到服务器后,服务器会检测request.header.referer
是不是当前站点,若正确的请求成功。因为CSRF是跨站请求,所以referer一般是其小服务器的站点。(不过referer可以伪造,因此一般不常用)