CSRF(Cross Site Request Forgery)一般被翻译为跨站请求伪造,那跨站请求伪造是什么意思呢?就是说某人使用链接或其他方式用你的身份(也就是你发送请求携带的Cookie)去发送对你不友好的请求。举个简单的例子:
A登录了某银行网站,看到了一个“科学理财,年盈利率过万”的链接,A好奇点开了这个链接,结果发现自己的银行账户少了10000元,这是怎么回事呢?原来是有黑客在这个链接中藏了一个请求,这个请求直接利用A的身份给银行发送了一个转账请求,也就是通过A的Cookie向银行发出请求。
<a src=http://www.mybank.com/Transfer?bankId=11&money=10000>科学理财,年盈利率过万</>
上边提到,进行Session认证的时候,一般是使用Cookie来存储Session,当我们登录后,后端生成一个SessionId放在Cookie中返回给客户端,服务端通过Redis或者其他存储工具记录保存这个SessionId,客户端登录以后每次请求都会带上这个SessionId,服务端通过这个SessionId来标识登录用户这个人,如果别人通过Cookie拿到了SessionId后就可以代替你的身份访问系统了。
Session认证中,Cookie中的SessionId是由浏览器发送到服务端的,借助这个特性,攻击者就可以通过让用户误点攻击链接,达到攻击效果。
但是如果我们使用Token就不会存在这个问题,在我们登录成功获得Token之后,一般会选择存放在IocalStorage(浏览器本地存储)中,然后我们在前端通过某些方式会给每个发到后端的请求加上这个Token,这样就不会出现CSRF漏洞的问题。因为即使你点击了非法链接将请求发送到了服务端,这个非法请求是不会携带Token的,所以这个请求是非法的。
需要注意的是:不论是Cookie还是Token都无法避免跨站脚本攻击(Cross Site Scripting)XSS,跨站脚本攻击缩写为CSS,但是我们都知道层叠样式表的缩写也是CSS,所以很可能会混淆,因此,有人将跨站脚本攻击缩写为XSS。XSS攻击者会用各种方式将恶意代码注入到其他用户的页面中,就可以通过脚本盗用用户的信息,比如用户的Cookie信息。
下一章我们说说如何防止CSRF攻击?