一、什么是 CSRF
跨站请求伪造(Cross-Site Request Forgery),通常缩写为 CSRF 或者 XSRF,是一种使已登录用户在不知情的情况下执行某种动作的攻击。
二、CSRF请求过程
CSRF在违反同源策略的情况下,攻击主要用来执行某种非法动作,而非窃取用户数据。
例如,当受害者是一个普通用户时,CSRF可以实现在其不知情的情况下进行转移用户资金、发送邮件等操作。但是如果受害者是一个具有管理员权限的用户,CSRF则可能威胁到整个Web系统的安全。
1、用户登录站点A(例如存在CSRF漏洞的某银行站点)。
2、登录成功后A站点将Cookie信息保存在用户的浏览器端。
3、在未登出A站点,并且A站点的Cookie还在有效期内,用户访问攻击者的网站B站点。
4、在用户不知情的情况下,浏览器执行B站点的恶意代码,要求用户浏览器请求A站点。
5、用户浏览器在用户不知情情况下携带用户的Cookie对A站点发起请求触发CSRF攻击(例如转账给某人,用户遭受损失)。
说明:
从上面的流程可以看出,CSRF攻击者拥有用户的全部权限,可以控制用户执行受控网站的所有操作,攻击者可以构造复杂的请求欺骗用户进行一系列的操作,例如购物和完成各种授权。
CSRF攻击是攻击者借助受害者的Cookie骗取服务器的信任,但是攻击者并不能拿到Cookie,也看不到Cookie的内容。另外,对于服务器返回的结果,由于浏览器同源策略的限制,攻击者也无法进行解析。
因此,攻击者无法从返回的结果中得到任何东西,他所能做的就是给服务器发送请求,以执行请求中所描述的命令,在服务器端直接改变数据的值,而非窃取服务器中的数据。
所以,要保护的对象是那些可以直接产生数据改变的服务,而对于读取数据的服务,则不需要进行CSRF的保护。比如,银行系统中转账的请求会直接改变账户的金额,会遭到CSRF攻击,所以需要保护。而查询余额是对金额的读取操作,不会改变数据,CSRF攻击无法解析服务器返回的结果,所以无须保护。
三、CSRF的防护