一. 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. "ssllabs" website and "testssl" website

    "https://www.ssllabs.com" could scan your server and give results about the weakness of yo ...

  2. 使用QJM实现HDFS的HA配置

    使用QJM实现HDFS的HA配置 1.背景 hadoop 2.0.0之前,namenode存在单点故障问题(SPOF,single point of failure),如果主机或进程不可用时,整个集群 ...

  3. centos 7(1611)安装笔记

    麻烦   前天我把双系统笔记本里的 deepin 的磁盘分区直接从 Windows 7 磁盘管理里格式化了,结果悲催了,开不了机了,显示: 我以为是 Windows 7 的引导没了,就进 PE 修复了 ...

  4. 用户表单事件(focus事件)

    以前做用户系统的时候经常用到表单验证,正则表达式事件来处理和绑定事件和进行事件,这里说的其实只是一小部分,也不是很值得写,但是今天遇到了还是写一下,毕竟基础还是蛮重要的,就算懂的童鞋,巩固一下也是好的 ...

  5. Selenium入门8 js调用

    execute_script 可以执行js和jquery脚本 示例如下:修改百度首页的按钮字体颜色,按钮隐藏,按钮显示 #coding=utf-8 # 调用js jquery from seleniu ...

  6. 近期流行的JavaScript框架与主题

    [新年快乐]2017年你应该关注的JavaScript框架与主题 2017-01-01 王下邀月熊 JavaScript JavaScript的繁荣促生了很多优秀的技术.框架与工具库,这空前的繁荣也给 ...

  7. maven parent version not found

    需要把parent工程,也就是package是pom的那个工程先install一下 要是不行的话可以试下mvn -X clean install,-X表示强制从远程库更新dependency:再不行可 ...

  8. 深入理解HDFS的架构和原理

    (一) HDFS主要是用于做什么的? HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处 ...

  9. alert、confirm、prompt的区别

    我们在开发一些后台管理系统的时候,经常会用到一些弹出框,今天我们一起看一下吧: alert:仅仅是一个提示的作用,通知用户,会阻线程,alert后面的代码,在用户点击确认后仍然会照常执行. confi ...

  10. 【javascript】ajax 基础

    什么是 ajax ajax 即“Asynchronous JavaScript and XML”(异步 JavaScript 和 XML),也就是无刷新数据读取. http 请求 首先需要了解 htt ...