当前位置: 代码迷 >> 综合 >> 跨站点请求伪造(CSRF)
  详细解决方案

跨站点请求伪造(CSRF)

热度:62   发布时间:2024-01-03 11:43:40.0
CSRF的全名是Cross Site Request Forgery,也就是跨站点请求伪造
在一开始我对它也是一无所知,之后再查阅相关的资料后,才有所了解,有很多人会把它和xss联系在一起,有一些人甚至把它和xss搞混淆。
举一个简单的例子说明一下
http://blog.sohu.com/manage/entry.do?m=delete&id=156713012,在登录了sohu博客后,只要请求这个URl,就能够把编号为“156713012”这篇博客给删除。
首先在自己的域构造一个页面,http://www.a.com/csrf.html,内容为:<img src="http://blog.sohu.com/manage/entry.do?m=delete&id=156714243"/>,这是使用了一个<img>标签,其地址指向了删除博客文章的链接。
当攻击者诱使用户去访问这个构造的页面,用户会看到一张无法显示的图片,再回头看看搜狐博客,可以看到编号为:“156714243”这篇博客被删除了。
刚才访问的页面,图片标签向搜狐的服务器发送了一次GET请求。
回顾一下整个攻击过程,攻击者仅仅诱使用户访问了一个页面,就以该用户的身份在第三方站点里执行了一次操作。
CSRF进阶:
浏览器所持有的cookie分为两种,1.session Cookie,又称为临时Cookie,2.Third-party Cookie,也称为本地Cookie。
可以使用csrf为伪造发送cookie,只要在http头中,加入header("set-cookie:1234")等内容php,然后再构造类似上面的伪造页面,就可以向服务器发送我们构造的cookie,但是IE出于安全的考虑,默认是禁止了浏览器在<img>,<iframe>,<script>,<link>等标签中发送第三方cookie,但是在Firefox2、3、opera、google Chrome、andriod等都是默认允许第三方cookie的。
如果实在不需要认证的时候,就可以忽略发送cookie了。但是在很多情况下,服务商都宁愿牺牲用户的用户体验,而要cookie等身份验证,那我们应该怎么实现csrf呢,可以使用P3P头,这伤害W3C指定的一项关于隐私的标准,全称是“The Platform for Privary Preferences",如果网站返回给浏览器的HTTP头中包含有P3P头,则在某种程度上允许发送第三方cookie。P3P主要用于类似广告等需要跨域访问的页面。可以通过构造P3P头来发送第三cookie,具体可以查阅W3C制定的标准,它的语法很简单,都是一一对应关系。
GET和POST请求,在传统意义上,安全人员都会认为,<img>、<iframe>、这些标签都是发送的是GET请求,使用防御csrf可以通过改为POST请求即可,但是在之前google Gmail就出现了一些问题,有安全研究人员,通过在恶意页面中,隐藏一个iframe,地址是指向pdp写的csrf伪造页面。构造了一个POST请求的链接,这个链接的作用是把参数生成一个POST的表单,并自动提交。在浏览器中已经存在Gmail的临时cookie,所以用户在iframe中对Gmail发起的这次请求会成功,并将所有带附件的邮件都转发到攻击者的邮箱中。
CSRF防御
1.验证码,被认为是对抗CSRF攻击最简洁而有效的防御方法
2.referer check,最常见的应用是”防止图片盗链“,但是在于处于隐私保护考虑,限制了referer的发送,所以在某些情况下,浏览器也不会发送referer。
3.Anti Csrf Token,就是在cookie或者是在session,或者query string中加入一些随机数,让攻击者难以构造出伪造的请求链接。对于Token的生成要采用安全的随机数生成器,比如物理随机数等
  相关解决方案