一. CSRF中间件

字面意思跨站请求伪造; 即模仿个请求朝服务器发送,django中对跨站伪造的请求有相应的校验

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

csrf_exempt  给单个视图排除校验,以装饰器形式给某个视图加上,则该视图就不会进行校验

局部禁用的前提是全局有校验

csrf_protect  给单个视图必须校验,以装饰器形式给某个视图加上,则该视图就必须进行校验

即使注释调settings中的46行也必须得校验.  局部使用的前提是全局没有校验

二. csrt源码解析其校验的本质大概流程是:

1. 在process_request内,从请求的cookie中获取csrftoken的值,保存为scrf_token

2. 在process_view内:

> 如果视图函数加上了csrf_exempt的装饰器  不做校验

> 如果请求方式是'GET', 'HEAD', 'OPTIONS', 'TRACE' 也不做校验

> 其它的请求方式就要进行校验了,校验的实质如下:

1.从request.POST中获取csrfmiddlewaretoken对象的值

2.从请求头中获取csrfmiddlewaretoken对象的值

3.用获取到的csrfmiddlewaretoken的值和csrftoken的值做比较,如果校验成功,流程继续;校验不成功

则拒绝;  1和2中只要有1个能获取到csrfmiddlewaretoken的值即可,不用两个中都有.

总结: 两点要求,1.浏览器必须带有cookie;  2. post请求体中或请求头中要能获取到csrfmiddlewaretoken值

 

三.针对以上总结的两点,做相应的处理,处理办法如下

确保浏览器带有cookie的两种方式:

> 在form表单内加入{% csrf_token %}

> 不使用{% csrf_token %},导入from django.views.decorators.csrf import ensure_csrf_cookie

将ensure_csrf_cookie以装饰器形式加在视图上,保证返回的相应有cookie

确保能从post请求体中或请求头信息中获取到csrfmiddlewaretokende的方式:

> 页面中加入{% csrf_token %}标签

1.获取标签值,加入post请求体中,  csrfmiddlewaretoken: $('[name="csrfmiddlewaretoken"]').val()

2.获取标签值,加入post请求头中,  headers: {"X-CSRFToken": $('[name="csrfmiddlewaretoken"]').val()}

> 上面1或2都是给单个的ajax请求加csrfmiddlewaretokende,这里再介绍个通过引入js文件形式

给全局所有ajax头部加入csrfmiddlewaretokende的办法,代码思路如下: (万能办法)

1.通过django官网提供的代码来实现,首先项目下static文件夹内新建js文件,复制以下代码:

2.以script标签在html页面导入新建的这个a.js文件, <script src=’/static/a.js’></script>

它的作用是给每个请求头信息上加crsfmiddlewaretoken信息

猜测: 引入js文件形式可同时让浏览器带cookie和让请求头带crsfmiddlewaretoken信息,因为使用

           CBV写ajax文件上传时,html中没加{%csrf_token%},views中也没用ensure_csrf_token装饰器

四. js文件代码如下:

function getCookie(name) {

    var cookieValue = null;

    if (document.cookie && document.cookie !== '') {

        var cookies = document.cookie.split(';');

        for (var i = 0; i < cookies.length; i++) {

            var cookie = jQuery.trim(cookies[i]);

            // Does this cookie string begin with the name we want?

            if (cookie.substring(0, name.length + 1) === (name + '=')) {

                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));

                break;

            }

        }

    }

    return cookieValue;

}

var csrftoken = getCookie('csrftoken');

function csrfSafeMethod(method) {

  // these HTTP methods do not require CSRF protection

  return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));

}

$.ajaxSetup({

  beforeSend: function (xhr, settings) {

    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {

      xhr.setRequestHeader("X-CSRFToken", csrftoken);

    }

  }

});

  

跨站请求伪造(csrf)中间件整理的更多相关文章

  1. django之跨站请求伪造csrf

    目录 跨站请求伪造 csrf 钓鱼网站 模拟实现 针对form表单 ajax请求 csrf相关的两个装饰器 跨站请求伪造 csrf 钓鱼网站 就类似于你搭建了一个跟银行一模一样的web页面 , 用户在 ...

  2. PHP安全编程:跨站请求伪造CSRF的防御(转)

    跨站请求伪造(CSRF)是一种允许攻击者通过受害者发送任意HTTP请求的一类攻击方法.此处所指的受害者是一个不知情的同谋,所有的伪造请求都由他发起,而不是攻击者.这样,很你就很难确定哪些请求是属于跨站 ...

  3. 跨站请求伪造(CSRF)-简述

    跨站请求伪造(CSRF)-简述 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 ...

  4. 跨站请求伪造(CSRF)攻击原理解析:比你所想的更危险

    跨站请求伪造(CSRF)攻击原理解析:比你所想的更危险 跨站请求伪造(Cross-Site Request Forgery)或许是最令人难以理解的一种攻击方式了,但也正因如此,它的危险性也被人们所低估 ...

  5. 跨站请求伪造 CSRF / XSRF<一:介绍>

    跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一 ...

  6. 跨站请求伪造CSRF(Cross-site request forgery)

    CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站 ...

  7. 跨站请求伪造(csrf)的防护手段

    CSRF CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造. CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求. 造成的问题:个人隐私泄露以及财产安全. CS ...

  8. 跨站请求伪造CSRF:攻击与防御

    CSRF是什么         (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为&quo ...

  9. 跨站请求伪造CSRF

    CSRF是Cross Site Request Forgery的缩写,乍一看和XSS差不多的样子,但是其原理正好相反,XSS是利用合法用户获取其信息,而CSRF是伪造成合法用户发起请求. 在XSS危害 ...

随机推荐

  1. php-fpm如何优化进程数

    参考链接: php-fpm进程数优化

  2. UDoc(云平台企业应用级 文档管理产品)

    类型: 定制服务 软件包: integrated industry solution collateral 联系服务商 产品详情 解决方案 概要 为企业提供基于云平台企业应用级文档管理产品,尽可能最大 ...

  3. springboot项目搭建:结构和入门程序

    Spring Boot 推荐目录结构 代码层的结构 根目录:com.springboot 1.工程启动类(ApplicationServer.java)置于com.springboot.build包下 ...

  4. Linux与Windows区别——总结中

    一:在Linux系统中,每一个文件都多加了很多的属性进来,尤其是用户组的概念 二:Windows下面一个文件是否具有执行的能力是通过“扩展名”来判断的,如:.exe,.bat,.com等 Linux下 ...

  5. Sublime插件支持Sass编译和Babel解析ES6 & .sublime-build文件初探(转载自imwtr)

    原文请看:http://www.cnblogs.com/imwtr/p/6010550.html   用Sublime Text蛮久了,配置配来配去的,每次换电脑都得重头再配过,奈何人老了脑子不中用了 ...

  6. mysql数据库 thinkphp连贯操作where条件的判断不正确的问题

    前两天一直写一个基于thinkphp的东西,遇到从mysql数据库里select数据,where条件一直出现问题的情况.直接上代码: $history = M('history'); $suerId ...

  7. 使用ecilpse(Java)调用Matlab代码

    1 安装java环境: http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载JDK最新版本并安装,CloudSim ...

  8. 2017.10.15 解析Java中抽象类和接口的区别

    (1)在Java语言中,abstract class 和interface 是支持抽象类定义的两种机制. 正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和 ...

  9. 2017.9.30 Java中引用类型变量的创建及使用&循环的高级

    今日内容介绍 1.引用类型变量的创建及使用 2.流程控制语句之选择语句 3.流程控制语句之循环语句 4.循环高级 ###01创建引用类型变量公式     * A: 创建引用类型变量公式         ...

  10. linux flushing file system caches

    We may drop the file system caches on Linux to free up memory for applications. Kernels 2.6.16 and n ...