每天一个知识点--CSRF
每天一个知识点--CSRF
首先来解释一下什么时CSRF。
CSRF 全称是跨站请求伪造。就是伪造你的请求,干一些别的事情,还要别人相信这确实是你干的,虽然这真的不是你干的。可是谁相信呢。
如何达到这种效果
要达到这种效果也比较简单,只要携带你的认证信息就可以了。因为互联网世界里,服务器不认人脸,只看证件(标识符),在网络的世界里,一个人会抽象成一堆数字来唯一标识你这个人。只要确认你这个标识符是对的,就执行相应的操作,而且也会认定,这确实就是你做的,你还没办法解释这个问题不是你做的,因为它带着你的标识符进来的。
攻击过程
前提条件,你登录了一个安全的网站,假设是A网站,并且还没有退出。然后又打开了一个浏览器窗口,或者一个链接,被诱导了恶意的网站,假设是B网站。天公就是这么不作美,这个恶意的网站B又恰好是用来攻击A的。你打开了这个B这个网站,或许又点击了某个好看的新闻链接。然后这个链接就在后面偷偷的发送了一个对A网站的请求。
恭喜你,中奖了。由于浏览器发送请求,会携带这你的A网站的Cookie信息去访问A网站,恰好你又没有退出A网站,你的登陆信息还是有效的。A网站的后台程序认为这是一个合法的请求,就是你自己主动发出去的,就执行了这个请求相应的操作。这个操作很可能导致你的信息丢失,或者默默的帮你关注了几个账号,删了你的一些信息等。
防范措施
使用随机数,csrftoken,每次发送的请求都携带这个token去服务器验证,这是你发送的请求,验证通过了再执行操作,验证失败就不执行。
csrftoken的设置,一定要足够随机,不能随便就可以猜到,而且要有实效性,不能登录一天,每次的请求csrftoken的值还是没有变化。
实际开发如何操作
csrftoken的生成是在服务器端进行的,生成后,在session中存储一个备份,返回个浏览器一个备份,浏览器收到后,可以存储在页面中,也可以存储在Cookie中。之后发送请求的时候,从页面中找到这个csrftoken,携带到请求里一起发送给服务器。在服务器校验的时候,一定不能使用Cookie中取出来的(Cookie中取的一定能认证通过,原因自己想一想,上面有介绍),再根据Cookie中的sessionid找到对应的session,并取出服务器端的csrftoken进行验证。
如此这般,基本就可以避免一些csrf的攻击了。