六、CsrfViewMiddleware
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。
关于更多关于CSRF的介绍,请参考以下链接:
http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html
Django应对CSRF攻击的机制是通过csrftoken(HTTP请求)或者csrftoken + HTTP_REFERER(HTTPS)来实现的。
CSRF防护的粒度主要有两类:
1、全局使能,所有视图(view)使能CSRF认证。
这个主要通过CsrfViewMiddleware中间件来实现。当该中间件添加到setting.py的MIDDLEWARE列表内时,即使能了CSRF中间件,CSRF中间件处理的时机主要是在处理完所有中间件的process_request(),即将进行视图渲染之前,以及response返回给客户端的数据中添加cookie的csrftoken信息之前。这两个功能分别通过process_view()和process_response()完成。当csrf中间件被使能时,所有http请求,都必须对csrttoken进行验证和处理,所有POST,DELETE等安全操作请求必须显示携带csrftoken(或通过http-body,或通过http-header的HTTP_X_CSRFTOKEN),其余安全操作,如'GET', 'HEAD', 'OPTIONS',
'TRACE'只需要在cookie中携带服务器返回给客户的csrftoken即可完成CSRF验证。
2、基于单个视图(view)。
这个主要通过基于CsrfViewMiddleware的装饰器函数实现,具体来说是csrf_exempt(),csrf_protect()等实现,前者将某个视图排除在CSRF验证之外,即无需进行CSRF验证,后者对某个视图进行强制验证。具体有多种方案:
方案一
('^my_page/$', csrf_exempt(my_page_view), {'template':
'my_page.html'})
方案二
@csrf_exempt
def my_page_view
(self, request, extra_context=None):
方案三
if not getattr(view, 'csrf_exempt', False):
inner = csrf_protect(inner)
通过走读CsrfViewMiddleware的代码,不难明白CSRF验证的工作原理,总结起来主要有以下几条:
1、'GET', 'HEAD', 'OPTIONS', 'TRACE'这些安全的操作方式,无需CSRF验证,如果有必要的话,只需做CSRF的更新操作,即当客户cookie携带了新的csrftoken,需要更新当前csrftoken。
2、POST和DELETE操作需要CSRF验证。特别是HTTPS请求,更需要HTTP_REFERER的双重确认机制。
3、对于POST操作,客户需要在http-body中携带csrfmiddlewaretoken(64B),且应该跟http头部中cookie解析到的cstftoken(64B)保持一致(两者解密之后对应的secret一样)。这个地方让我觉得很奇怪,为什么要同时携带着两者呢?
这两串数据不一样,但是解密之后又是一样的,中间到底有什么关联?
def _unsalt_cipher_token (token) /*解密*/
salt = token[:32]
cipher = token[32:]
secret = FUNC_inverse(salt,
token)
def _salt_cipher_secret(secret): /*加密*/
salt
= _get_new_csrf_string() /*salt为随机生成的32B字符串*/
cipher
= FUNC(secret, salt)
return
salt(32B) + cipher(32B)
加密,解密涉及到的过程表示成框图如下:

4、在Django的CSRF处理机制中,当通过admin/login登录后,会强制更新csrftoken并返回给客户,客户在接下来的请求中,可以在http头部携带非POST请求)携带该token即可。
def rotate_token(request):
# Changes the CSRF token in use for a
request - should be done on login for security purposes.
request.META.update({
"CSRF_COOKIE_USED": True,
"CSRF_COOKIE": _get_new_csrf_token(),
})
request.csrf_cookie_needs_reset
= True
在CsrfViewMiddleware的process_response()接口中,如果发现csrf_cookie_needs_reset标志位为真,即对返回的response更新cookie中的csrftoken字段。
客户端和服务器csrf_token交互的过程如下图所示:

其中,第一次,客户请求的cookie或者不携带csrftoken(箭头上面情况,通常是用户首次登陆),或者携带旧的csrftoken(箭头下面情况),如果是普通的安全操作(如GET)等,不对CSRF进行更新,只会更新其过期时间等属性,因此在返回的response中,csrftoken依然是old_token,但是携带了set-cookie头,通知客户端,cookie更新了。
第二次,客户通过POST admin/login登录服务器,这时后需要在http请求的http-body中携带csrfmiddlewaretoken,此时,头部携带cookie中携带的csrftoken依然是old_token,服务器登录成功后,强制更新csrftoken为new_token,并返回给客户端。
第三次,后续的客户请求,都采用新的new_token发起请求,如果csrftoken没有更新,则返回的response中cookie不再携带csrftoken信息。
六、CsrfViewMiddleware的更多相关文章
- Python之路【第十六篇】:Django【基础篇】
Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...
- 第三百一十六节,Django框架,中间件
第三百一十六节,Django框架,中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间 ...
- Django框架(十六)-- 中间件、CSRF跨站请求伪造
一.什么是中间件 中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出 二.中间件的作用 如果你想修改请求,例如被传送到view ...
- 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文
阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...
- MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息
MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...
- 【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
- CRL快速开发框架系列教程六(分布式缓存解决方案)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 【微信小程序开发•系列文章六】生命周期和路由
这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...
- 我的MYSQL学习心得(六) 函数
我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...
随机推荐
- window.location.href 中文乱码问题。。。。
window.location.href 中文乱码问题.... 要解决此问题需要两次解码, 第一次解码: 是在页面中的js脚本中解码:window.location.href = "save ...
- ubuntu下 编译安装swftools
1.下载:http://www.swftools.org/download.html2.安装: tar -zvxf swftools-0.x.x.tar cd swftools-0.x.x ./con ...
- HDFS 异常处理与恢复
在前面的文章 <HDFS DataNode 设计实现解析>中我们对文件操作进行了描述,但并未展开讲述其中涉及的异常错误处理与恢复机制.本文将深入探讨 HDFS 文件操作涉及的错误处理与恢复 ...
- ABP理论学习之Web API控制器(新增)
返回总目录 本篇目录 介绍 AbpApiController基类 本地化 审计日志 授权 工作单元 其他 介绍 ABP通过Abp.Web.ApiNuget包集成了 ASP.NET Web API控制器 ...
- 【腾讯Bugly干货分享】Redex初探与Interdex:Andorid冷启动优化
本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/583b9e3ee8992c2c2df6e6ac 导语 早在去年10月份,face ...
- 【腾讯Bugly干货分享】微信小程序开发思考总结——腾讯“信用卡还款”项目实践
本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/58212d0fa7a7574c4f4cc3c5 作者:peggy 小程序概述 1 ...
- ASP.Net请求处理机制初步探索之旅 - Part 4 WebForm页面生命周期
开篇:上一篇我们了解了所谓的请求处理管道,在众多的事件中微软开放了19个重要的事件给我们,我们可以注入一些自定义的业务逻辑实现应用的个性化设计.本篇,我们来看看WebForm模式下的页面生命周期. ( ...
- Morris.js和flot绘制折线图的比较
[文章摘要] 最近用开源的AdminLTE做框架感觉效果特别好,其针对图表库Morris.js和flot都提供了不错的支持,也都提供了这两者的例子.不过Morris.js是基于Raphael.js来的 ...
- SQL Server AlwaysOn
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/高性能解决方案 概述 环境: 域服务器:windows server 2008 R2 SP1,192.168.2.10 DNS:1 ...
- JavaScript面试时候的坑洼沟洄——逗号、冒号与括号
看完了javaScript数据类型和表达式与运算符相关知识后以为可以对JavaScript笔试题牛刀小试一把了,没想到有一次次的死在逗号,冒号和括号上,不得已再看看这几个符号吧. 逗号 逗号我们常见的 ...