下班的时候跟公司大神一块儿走,问了他几个问题,接着就给我讲了XSS攻击和CSRF攻击,他经过举例子的方式讲解,通俗易懂,感受收获很大!又学到了一些新知识,内心特别高兴,为了防止我这个脑子很快就忘掉,因此趁着热乎,写下来,方便之后回顾一下~html
1、什么是CSRF?数据库
CSRF是Cross Site Request Forgery的缩写,翻译过来就是跨站请求伪造。那么什么是跨站请求伪造呢?让我一个词一个词的解释:跨域
一、跨站:顾名思义,就是从一个网站到另外一个网站。浏览器
二、请求:即HTTP请求。安全
三、伪造:在这里能够理解为仿造、假装。服务器
综合起来的意思就是:从一个网站A中发起一个到网站B的请求,而这个请求是通过了假装的,假装操做达到的目的就是让请求看起来像是从网站B中发起的,也就是说,让B网站所在的服务器端误觉得该请求是从本身网站发起的,而不是从A网站发起的。固然,请求通常都是恶意的。dom
看到这里,你可能会问:为何要假装成从B网站发起的呢?从网站A直接向B网站服务器发起请求不能够吗?网站
要回答这个问题,就须要咱们对Cookie机制有必定的认识。关于Cookie机制我会单独写一篇文章,这里不作详细介绍。这里你只须要知道:之因此要假装成从B网站发起的,是由于Cookie是不能跨域发送的。结合上面这个例子来讲就是:若是从A网站直接发送请求到B网站服务器的话,是没法将B网站中产生的Cookie一块儿发给B服务器的。ui
可能你还会问,为何非要发送Cookie呢?这是由于服务器在用户登陆后会将用户的一些信息放到Cookie中返回给客户端,而后客户端在请求一些须要认证的资源的时候会把Cookie一块儿发给服务器,服务器经过读取Cookie中的信息来进行用户认证,认证经过后才会作出正确的响应。翻译
A网站访问B网站服务器的一些须要认证的资源的时候,若是没有Cookie信息,服务器是拒绝访问的,那么A网站就没法进行恶意操做。而伪形成B网站的请求,就能够将B网站的Cookie一块儿发到B服务器,这个时候就服务器就认为该请求是合法的,就会给出正确的响应,这个时候,A网站就达到目的了。
简单一句话就是:攻击者盗用了你的身份,以你的名义发送恶意请求。
那么,A网站经过CSRF可以作那些操做呢?
2、CSRF可以作什么呢?
CSRF可以作的事情包括:以你名义发送邮件,发消息,盗取你的帐号,甚至于购买商品,虚拟货币转帐……形成的问题包括:我的隐私泄露以及财产安全。等等等等。
3、通俗点的例子
下面咱们举个例子来讲明CSRF攻击是如何实现的。
假设有一个微博网站B,B有一个“加关注”的功能,即一个用户能够关注另外一个用户,而这个功能是这样的实现的:用户每次点击“加关注”按钮的时候,就会向服务器发送一个GET请求,URL以下:
http://www.bdomain.com/addfriends?uid=123
URL中的参数uid表示的是你要关注的用户的ID。
在正常状况下,即你登陆B网站后,点击“加关注”按钮,浏览器会将上面的URL连同B网站产生的Cookie一块儿发送到B网站的服务器,B服务器首先经过Cookie进行用户认证,若是Cookie中的信息正确,就会进行向数据库中写入记录,这样,你就成功关注了ID为123的用户。
假如我是一个恶意用户,我想让更多的人关注我,而我又不想经过正常的渠道去实现,由于毕竟正常渠道比较浪费时间,因而我便开始想歪主意,碰巧,B网站的“加关注”的实现原理被我发现了。这个时候,我便进行了以下操做:
首先我在我本身的网站A里发了篇文章,文章中全是妖娆的美女图片,你们都喜欢美女嘛,因此就会有不少人来看个人这些美女,咱们知道,图片在网页中大都是经过<img scr=”http://….”/>这样的形式实现的,图片加载的时候就会请求src中指定的URL,而我就把众多美女图片的src写成了B博客里“加关注”的URL,不一样的是将参数uid的值都写成了我在B网站中的ID(假设是456),即:
http://www.bdomain.com/addfriends?uid=456
在网站A中的代码中就是:<img src=”http://www.bdomain.com/addfriends?uid=456″ />,当用户点击我发的文章的时候,浏览器就会请求这个src中的URL,这样就达到了在A网站中请求B服务器资源的目的,可是这样还差了一步,由于请求仍是从A网站发出的,因此就没有B网站产生的Cookie,因此仍是达不到目的,那该怎样作呢?
这就须要利用用户的上网习惯了,咱们平时都会同时浏览不少网页,好比,你打开浏览器登陆了B网站,与此同时,你可能也打开了个人网站A,而碰巧被我网站里全是美女的帖子吸引住了,就忍不住打开了这个帖子,这个时候,个人网站A就发起了上面的那个到B服务器的请求,而此时,你已经登陆了B网站,Cookie已经产生了,浏览器一看请求的域名是bdomain.com,便将存放在客户端的B网站的Cookie给顺带一块儿发了过去,这样,服务器就会误认为是你主动要关注个人,因而,便向数据库写入了一条记录,而你就在不知不觉中,默默无闻的关注我了~~~
这样,个人目的就达到了~~~~
而若是不少用户都像你同样,在登陆B微博的同时查看了个人帖子,那么他们也同样,默默无闻的关注了我~因而,个人粉丝量就大增!~~~
这里要说明一下:上面例子中说的同时打开多个网页只是能够被利用的方法中的一种,但并非惟一的一种,你要知道,黑客们可不是吃素的啊,他们手段多着呢~在此顺道向黑客们的技术深深的致一敬~!
4、下面借用别人的图文来讲明一个整个CSRF的过程:
从上图能够看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤:
1.登陆受信任网站A,并在本地生成Cookie。
2.在不登出A的状况下,访问危险网站B。
看到这里,你也许会说:“若是我不知足以上两个条件中的一个,我就不会受到CSRF的攻击”。是的,确实如此,但你不能保证如下状况不会发生:
1.你不能保证你登陆了一个网站后,再也不打开一个tab页面并访问另外的网站。
2.你不能保证你关闭浏览器了后,你本地的Cookie马上过时,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登陆/结束会话了……)
3.上图中所谓的攻击网站,多是一个存在其余漏洞的可信任的常常被人访问的网站。
5、GET仍是POST
上面我举得例子中,B网站用的是GET请求,因此就被我轻松的利用了,那么,若是B网站“加关注”的实现方式采用的是POST请求,是否是就能有效防止CSRF攻击了呢?
不是这样的,若是B改用了POST请求,那么经过<img src/>这样的方式的确没法达到目的了,可是攻击者仍是能够经过人为构造POST请求的方式达到目的。
那么,在开发过程当中,应该如何有效避免CSRF攻击呢?
要回答这个问题,请参考:
http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html
http://book.2cto.com/201212/12162.html