一、跨站请求伪造攻击概述
跨站请求攻击(Cross-site request forgery),是指攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作。用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本XSS相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户浏览器的信任。
攻击者并不能通过CSRF攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户浏览器,让其以用户的名义运行操作。
二、跨站请求伪造攻击原理
产生跨站请求伪造攻击的前提是用户已经登录了正常网站,在其Cookie未失效的情况下访问了攻击者的网站,攻击者的网站会请求浏览器访问正常网站,图示如下:
举例来说,如果用户登录的是某银行的网站,用户可以通过该网站进行转账操作,转账操作的地址是http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName,则在访问恶意网站后,该网站可能会请求再次访问该接口,只不过参数的收款人是攻击者提供的,那么最终就会导致用户账户像攻击者账户转账。
三、跨站请求伪造攻击防御
跨站请求伪造攻击如果针对银行网站,通常会导致用户转账、信息泄漏等风险;如果是针对网购网站可能会导致恶意下单、恶意充值等,常用的防御手段如下:
- HTTP Referer:HTTP头字段 Referer 中的域名就是当前网站,服务端可以利用这个 Referer 判断请求是否来自自己的网站页面。
- anti-csrf-token:csrf_token由服务器颁发,不要放到 cookie 里,要通过其他方式提供给网站的前端页面,发起请求时csrf_token作为一个参数带上,让服务端校验。
- 使用严格的 SameSite:Cookie 有一个 SameSite 属性,设置为严格模式(非 none 值),可以让其他网站的中跨域请求不带上 Cookie。
- 人机校验:增加短信校验、邮箱校验、图像验证码校验,确保是一个人在尝试发这个请求。可以吊打所有攻击,缺点是用户体验不太好。