什么是CRSF
CSRF(Cross-site request forgery),中文名称:跨站请求伪造
CSRF攻击原理解释
当你登录一个网站A后,在没有登出的情况下,你又跑到一个其他的论坛上闲逛,然后你看到一个美女的图片,你出于好奇心,点击了美女图片,这个时候,可能就被攻击了;原因是美女图片的的超链接(link)可能是不法分子弄的,指向的可能是A网站,由于你在A网站还是登陆态,那么你点击的这个link就是以你登录态的进行的,比如可以用你的登录态发布评论;严重的可能进行转账。而你却浑然不知。
比如图片的html代码是:
<a href="http://www.a.com/addcomments?comment='XX是XX'"><img src='http://xx.com/beauty.jpg'/></a>
就这样,由于看了一个美女,可能你就被卷入了一场官司,xx可能告你诽谤。
攻击流程图
CRSF攻击流程图攻击要点:
1、用户在登录授信网站后并在没有登出的情况下访问了危险网站。
2、授信网站对CRSF攻击没有做好防备。
如果防止攻击
1、要访问其他网站时,先登出你之前登录的网站(这条貌似不现实)
2、不访问危险网站(这个也不惧操作性)
3、授信网站做好CRSF攻击的防备,让攻击者无懈可击。(可以实现)
防CRSF攻击的方法
之前说了攻击者会精心构造一个请求,并引导你发送这个请求。如果我们让攻击者再怎么精心构造,也没法构造一个有效的请求,那么就可以达到我们的目的了。
如果我们的服务每次都需要一个token, 访问的时候,服务端验证一个这个token是否合法,如果不合法,则拒绝访问,那么这样就达到了防crsf攻击的目的。
具体做法:
1、一般操作数据都使用表单,在表单增加一个隐藏域,在渲染表单时候,后台给一个token作为这个隐藏域的值。(token可以存在缓存中)
2、提交表单时,将这个隐藏域一起提交
3、后台验证请求中的token是否合法,不合法则拒绝。(token使用 完成后可以删除)。
为什么写这篇文章
今天看代码时,发现代码中也考虑了防crsf攻击,是其实是防不住的。
我看到代码的主要问题是:token不是放在请求参数中,而是放在了cookie中,这样攻击的请求同样会带上这个token(浏览器会将cookie自动带上),就达不到防攻击的作用了。
网友评论