CSRF攻击原理及防护

1、CSRF攻击原理css

  CSRF是什么呢?CSRF全名是Cross-site request forgery,是一种对网站的恶意利用,CSRF比XSS更具危险性。想要深刻理解CSRF的攻击特性咱们有必要了解一下网站session的工做原理。 

  session我想你们都不陌生,不管你用.net或PHP开发过网站的都确定用过session对象,然而session它是如何工做的呢?若是你不清楚请往下看。 
先问个小问题:若是我把浏览器的cookie禁用了,你们认为session还能正常工做吗? 

  答案是否认的,我在这边举个简单的例子帮助你们理解session。 
好比我买了一张高尔夫俱乐部的会员卡,俱乐部给了我一张带有卡号的会员卡。我能享受哪些权利(好比我是高级会员卡能够打19洞和后付费喝饮料,而初级会员卡只能在练习场挥杆)以及个人我的资料都是保存在高尔夫俱乐部的数据库里的。我每次去高尔夫俱乐部只须要出示这张高级会员卡,俱乐部就知道我是谁了,而且为我服务了。

  这里咱们的高级会员卡卡号 = 保存在cookie的sessionid; 
而个人高级会员卡权利和我的信息就是服务端的session对象了。 

  咱们知道http请求是无状态的,也就是说每次http请求都是独立的无关以前的操做的,可是每次http请求都会将本域下的全部cookie做为http请求头的一部分发送给服务端,因此服务端就根据请求中的cookie存放的sessionid去session对象中找到该会员资料了。 
固然session的保存方法多种多样,能够保存在文件中,也能够内存里,考虑到分布式的横向扩展咱们仍是建议把它保存在第三方媒介中,好比redis或者mongodb。 

  咱们理解了session的工做机制后,CSRF也就很容易理解了。CSRF攻击就至关于恶意用户A复制了个人高级会员卡,哪天恶意用户A也能够拿着这张假冒的高级会员卡去高尔夫俱乐部打19洞,享受美味的饮料了,而我在月底就会收到高尔夫俱乐部的帐单! 

  了解CSRF的机制以后,危害性我相信你们已经不言而喻了,我能够伪造某一个用户的身份给其好友发送垃圾信息,这些垃圾信息的超连接可能带有木马程序或者一些欺骗信息(好比借钱之类的),若是CSRF发送的垃圾信息还带有蠕虫连接的话,那些接收到这些有害信息的好友万一打开私信中的链接就也成为了有害信息的散播着,这样数以万计的用户被窃取了资料种植了木马。整个网站的应用就可能在瞬间奔溃,用户投诉,用户流失,公司声誉一落千丈甚至面临倒闭。曾经在MSN上,一个美国的19岁的小伙子Samy利用css的background漏洞几小时内让100多万用户成功的感染了他的蠕虫,虽然这个蠕虫并无破坏整个应用,只是在每个用户的签名后面都增长了一句“Samy 是个人偶像”,可是一旦这些漏洞被恶意用户利用,后果将不堪设想,一样的事情也曾经发生在新浪微博上面。 

  举例: 

  CSRF攻击的主要目的是让用户在不知情的状况下攻击本身已登陆的一个系统,相似于钓鱼。如用户当前已经登陆了邮箱,或bbs,同时用户又在使用另一个,已经被你控制的站点,咱们姑且叫它钓鱼网站。这个网站上面可能由于某个图片吸引你,你去点击一下,此时可能就会触发一个js的点击事件,构造一个bbs发帖的请求,去往你的bbs发帖,因为当前你的浏览器状态已是登录状态,因此session登录cookie信息都会跟正常的请求同样,纯自然的利用当前的登录状态,让用户在不知情的状况下,帮你发帖或干其余事情。redis

 

2、CSRF防护mongodb

  • 经过 referer、token 或者 验证码 来检测用户提交。
  • 尽可能不要在页面的连接中暴露用户隐私信息。
  • 对于用户修改删除等操做最好都使用post 操做 。
  • 避免全站通用的cookie,严格设置cookie的域。