对CSRF(跨站请求伪造)的理解

一、什么是CSRF?

CSRF是Cross Site Request Forgery的缩写,翻译过来就是跨站请求伪造。那么什么是跨站请求伪造呢?让我一个词一个词的解释:

1、跨站:顾名思义,就是从一个网站到另一个网站。

2、请求:即HTTP请求。

3、伪造:在这里可以理解为仿造、伪装。

综合起来的意思就是:从一个网站A中发起一个到网站B的请求,而这个请求是经过了伪装的,伪装操作达到的目的就是让请求看起来像是从网站B中发起的,也就是说,让B网站所在的服务器端误以为该请求是从自己网站发起的,而不是从A网站发起的。当然,请求一般都是恶意的。

看到这里,你可能会问:为什么要伪装成从B网站发起的呢?从网站A直接向B网站服务器发起请求不可以吗?

要回答这个问题,就需要我们对Cookie机制有一定的认识。关于Cookie机制我会单独写一篇文章,这里不做详细介绍。这里你只需要知道:之所以要伪装成从B网站发起的,是因为Cookie是不能跨域发送的。结合上面这个例子来说就是:如果从A网站直接发送请求到B网站服务器的话,是无法将B网站中产生的Cookie一起发给B服务器的。

可能你还会问,为什么非要发送Cookie呢?这是因为服务器在用户登录后会将用户的一些信息放到Cookie中返回给客户端,然后客户端在请求一些需要认证的资源的时候会把Cookie一起发给服务器,服务器通过读取Cookie中的信息来进行用户认证,认证通过后才会做出正确的响应。

A网站访问B网站服务器的一些需要认证的资源的时候,如果没有Cookie信息,服务器是拒绝访问的,那么A网站就无法进行恶意操作。而伪造成B网站的请求,就可以将B网站的Cookie一起发到B服务器,这个时候就服务器就认为该请求是合法的,就会给出正确的响应,这个时候,A网站就达到目的了。

简单一句话就是:攻击者盗用了你的身份,以你的名义发送恶意请求。

那么,A网站通过CSRF能够做那些操作呢?

二、CSRF能够做什么呢?

CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。等等等等。

三、通俗点的例子

下面我们举个例子来说明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微博的同时查看了我的帖子,那么他们也一样,默默无闻的关注了我~于是,我的粉丝量就大增!~~~

这里要说明一下:上面例子中说的同时打开多个网页只是可以被利用的方法中的一种,但并不是唯一的一种,你要知道,黑客们可不是吃素的啊,他们手段多着呢~在此顺道向黑客们的技术深深的致一敬~!

四、下面借用别人的图文来说明一个整个CSRF的过程:

从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤:

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

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

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

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

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

3.上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。

五、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

==================================================

转载:https://my.oschina.net/jasonultimate/blog/212554

声明:本文的第四部分摘自:https://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html

若对原作者造成了困扰,请及时与小菜菜联系~

原文地址:https://www.cnblogs.com/Sun-MyBlog/p/11330731.html

时间: 2024-10-11 16:01:30

对CSRF(跨站请求伪造)的理解的相关文章

理解CSRF(跨站请求伪造)

理解CSRF(跨站请求伪造) 原文出处Understanding CSRF 对于Express团队的csrf模块和csurf模块的加密函数的用法我们经常有一些在意. 这些在意是莫须有的,因为他们不了解CSRF token是如何工作的. 下面快速过一遍! 读过后还有疑问?希望告诉我们错误?请开一个issue! 一个CSRF攻击是如何工作的? 在他们的钓鱼站点,攻击者可以通过创建一个AJAX按钮或者表单来针对你的网站创建一个请求: <form action="https://my.site.c

Django框架之中间件、CSRF跨站请求伪造

一.中间件 1.什么是中间件 中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的功能. 中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法. 2.Django中的中间件 django默认有7个中间件 MIDDLEWARE = [ 'django.middlewar

Ajax--参数,csrf跨站请求伪造,serialize(),上传文件formdata

https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js. 一:参数,processData,contentType,traditional,dataType ######################------------data---------################ data: 当前ajax请求要携带的数据,是一个json的object对象,ajax方法就会默认地把它编码成某种格式 (urlencoded:?a=

ajax向Django前后端提交请求和CSRF跨站请求伪造

1.ajax登录示例 urls.py from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login_ajax/$', views.login_ajax, name='login_ajax'), url(r'^index/$', views.index, n

Django框架 之 基于Ajax中csrf跨站请求伪造

ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({     data: {csrfmiddlewaretoken: '{{ csrf_token }}' }, }); 方式二 1 2 3 4 5 <form> {% csrf_token %} </form><br><br><br>$.ajax({<br>...<br>data:{ "csrfmiddlewaretoken":

Django框架(十六)-- 中间件、CSRF跨站请求伪造

一.什么是中间件 中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出 二.中间件的作用 如果你想修改请求,例如被传送到view中的HttpRequest对象. 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现. 可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现. Django默认的中间件:(在django项目的settings模块中,有一个 MIDDLE

Python Django 生命周期 中间键 csrf跨站请求伪造 auth认证模块 settings功能插拔式源码

一 django 生命周期 二 django中间键 1.什么是中间键 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的功能. 简单来说就相当于django门户,保安:它本质上就是一个自定义类,类中定义了几个方法. 请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models): 响应走的时候也需要经过中间件才能到达w

☆Django☆---中间件 csrf跨站请求伪造 auth模块 settings功能插拔式源码

Django中间件 django生命周期图 中间件: 概念: Django中间件就类似于 django的保安   请求 的时候需要先经过中间件才能到达django后端(urls, views)   响应 走的时候也需要经过中间件才能到达web服务网关接口 django默认的七个中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.Session

Django中间件、csrf跨站请求伪造以及基于Django中间件思想实现功能的插拔式配置

一.django中间件 1.1解释:django中间件是类似于是django的保安,请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models),响应走的时候也需要经过中间件才能到达web服务网关接口 1.2django默认的七个中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.Session

五十二、django 中间件,csrf跨站请求伪造,auth模块表

django 中间件 django中间件事类似django的保安,请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models), 响应走的时候也需要经过中间件才能到达web服务网关接口 django中间件中有五个用户可以自定义的方法 django中间件可以用来做什么? 1.网站全局的身份校验,访问频率限制,权限校验..只要涉及到全局的校验都可以在中间件中完成 2.django的中间件是所有web框架中,做的最好 需要掌握的方法有: 1.proces