博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CSRF防护
阅读量:5886 次
发布时间:2019-06-19

本文共 2930 字,大约阅读时间需要 9 分钟。

CSRF

1、什么是CSRF?

  CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

2、原理

CSRF防护

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

•1.登录受信任网站A,并在本地生成Cookie 。
•2.在不退出A的情况下,访问危险网站B。

ps:注意并不是你退出了A后登陆B就会没事,因为你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。

CSRF预防机制

CSRF的防御可以从服务端和客户端两方面着手,防御效果是从服务端着手效果比较好,现在一般的CSRF防御也都在服务端进行。

token防御的整体思路是:

第一步:后端随机产生一个token,把这个token保存在SESSION状态中;同时,后端把这个token交给前端页面;

第二步:下次前端需要发起请求(比如发帖)的时候把这个token加入到请求数据或者头信息中,一起传给后端;

第三步:后端校验前端请求带过来的token和SESSION里的token是否一致;

1、Django下的CSRF预防机制

django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token,

这样就能避免被 CSRF ***。

在 templete 中, 为每个 POST form 增加一个 {% csrf_token %} tag. 如下:

1.在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token
2.在所有的 POST 表单模板中,加一个{% csrf_token %} 标签,它的功能其实是给form增加一个隐藏的input标签,如下
<input type="hidden" name="csrfmiddlewaretoken" value="{
{ csrf_token }}">,而这个csrf_token = cookie.csrftoken,在渲染模板时context中有context['csrf_token'] = request.COOKIES['csrftoken']

3.

在通过表单发送POST到服务器时,表单中包含了上面隐藏了crsrmiddlewaretoken这个input项,服务端收到后,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf ***,返回 403 Forbidden.

4.在通过 ajax 发送POST请求到服务器时,要求增加一个x-csrftoken header,其值为 cookie 里的 csrftoken 的值,服务湍收到后,django会验证这个请求的cookie里的csrftoken字段与ajax post消息头中的x-csrftoken header是否相同,如果相同,则表明是一个合法的请求

具体实现方法

django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。

全局:

  中间件 django.middleware.csrf.CsrfViewMiddleware

局部:

注:from django.views.decorators.csrf import csrf_exempt,csrf_protect

1、原理

  在客户端页面上添加csrftoken, 服务器端进行验证,服务器端验证的工作通过'django.middleware.csrf.CsrfViewMiddleware'这个中间层来完成。在django当中防御csrf***的方式有两种:

   1.在表单当中附加csrftoken

   2.通过request请求中添加X-CSRFToken请求头。

注意:Django默认对所有的POST请求都进行csrftoken验证,若验证失败则403错误侍候。

2、应用

1、在表单中附加csrftoken

> veiw中设置返回值:>   return render_to_response('Account/Login.html',data,context_instance=RequestContext(request)) > #在渲染模块时,使用 RequestContext。RequestContext 会处理 csrf_token 这个 tag,  从而自动为表单添加一个名为 csrfmiddlewaretoken 的 input >      或者>      return render(request, 'xxx.html', data)   #使用render则会自动生成,不用ReqestContext>   > html中设置Token:> {% csrf_token %}

2、Ajax

对于传统的form,可以通过表单的方式将token再次发送到服务端,而对于ajax的话,使用如下方式。

> from django.template.context import RequestContext> # Create your views here.>   >   > def test(request):>   >     if request.method == 'POST':>         print request.POST>         return HttpResponse('ok')>     return  render_to_response('app01/test.html',context_instance=RequestContext(request))>
前端:

  2、在进行post提交时,获取Cookie当中的csrftoken并在请求中添加X-CSRFToken请求头, 该请求头的数据就是csrftoken。通过$.ajaxSetup方法设置AJAX请求的默认参数选项, 在每次ajax的POST请求时,添加X-CSRFToken请求头

> ```> > > >     
> > > > {% csrf_token %}> > > > > > > >
摘自:https://www.cnblogs.com/freely/p/6928822.html

转载于:https://blog.51cto.com/wangheyu1/2115647

你可能感兴趣的文章
c语言 中的共用体和结构体如何联合定义,结构体(Struct)、联合体(Union)和位域
查看>>
SDL如何嵌入到QT中?!
查看>>
P1026 统计单词个数
查看>>
[js高手之路] html5 canvas系列教程 - 状态详解(save与restore)
查看>>
poi excel 常用api
查看>>
AD提高动态的方法(附SNR计算)
查看>>
[转]轻松实现可伸缩性,容错性,和负载平衡的大规模多人在线系统
查看>>
五 数组
查看>>
也谈跨域数据交互解决方案
查看>>
EntityFramework中使用Include可能带来的问题
查看>>
面试题28:字符串的排列
查看>>
css important
查看>>
WPF 实现窗体拖动
查看>>
NULL不是数值
查看>>
Oracle学习笔记之五,Oracle 11g的PL/SQL入门
查看>>
大叔手记(3):Windows Silverlight/Phone7/Mango开发学习系列教程
查看>>
考拉消息中心消息盒子处理重构(策略模式)
查看>>
so easy 前端实现多语言
查看>>
【追光者系列】HikariCP源码分析之ConcurrentBag&J.U.C SynchronousQueue、CopyOnWriteArrayList...
查看>>
canvas系列教程05-柱状图项目3
查看>>