什么是CSRF
利用用户已经登录的身份,在用户毫不知情的情况下,以用户的名义完成非法操作
CSRF攻击原理
- 用户登录web网站,此时浏览器含有用户登录信息
- 黑客构造恶意网站
- 用户主动访问恶意网页,转账到黑客用户。
真正完成转账的关键在于:浏览器cookie存放有用户的登录凭证,当浏览器发送请求时,会继续带上已有的cookie, 而受害网站本身也存在csrf漏洞,如无token校验,无法区别请求是用户还是攻击者
恶意网页的构造技巧: 含有攻击的网页不会显示任何内容,只会在加载的时候提交新的请求,实现转账操作
csrf的防御
Referer头检测法
Referer标识当前请求的来源页面,浏览器访问时除了自动带上Cookie还会自动带上Referer,所以服务端可以检测Referer头是否本网站页面来决定是否响应请求。
Referer是浏览器自动带上的,基于认为浏览器没有相关漏洞的前提下,我们可以认为攻击者是没法伪造Referer头的,也就是检测Referer头的方法是可靠的。
但该方式有时会不受认可,一是因为浏览器是可以设置禁止发送Referer头的,如果使用该方式那么禁止Referer头的浏览将无法正常使用,这可能会降低用户使用体验。二是因为由于移动端的崛起当下流行前后端分离app和web共用一套后端代码,但app是不会自动带Referer头的,如果使用该方式app端不好处理。
token检测法
当前主流的框架为了预防这种攻击,都是采用TOKEN机制。也就是说当用户与服务端进行交互的时候,传递一个加密字符串到服务端,服务端来检测这个字符串是否是合法的,如果不合法就有可能是黑客伪造用户信息进行请求的。
那么这个加密字符串是怎么生成的那?加密字符串是由后端程序生成,然后赋值到页面之上。一般是由当前控制器,方法,密钥,时间组合在一起加密而成。传递到服务端以后,服务端重新生成一遍,如果一致就是合法的,否则就是不合法的。
如上面的转账提交操作,如果采用Token校验,需要用户先去访问转账页面,正常服务器返回转账页面并返回一个与页面对应Token, 用户在填写完转账信息提交时候需要带上Token信息,这样服务器就知道这个转账申请是不是是由自己发送的。因为CSRF中攻击者是直接提交转账申请,并没有前面访问转账页面获取Token的过程。
扩展:那为什么现在的转账申请还需要验证码或短信校验的操作?
原因是,既然攻击者可以伪造转账申请提交页面,完全有可能通过伪造一序列的页面完成访问转账页面生成Token,并提交转账申请的操作。这个时候,如果服务器端通过短信校验的方式呢,用户一收到短信,就知道自己账号存在泄密风险了。就可能将这些伪造页面给戳破了。