Django进阶之CSRF的解决

简介

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

全局

中间件 django.middleware.csrf.CsrfViewMiddleware

局部:

@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。

@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

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

原理

当用post提交数据的时候,django会去检查是否有一个csrf的随机字符串,如果没有就会报错,这也是之前我们一直将其注释的原因,错误如下:

在django内部支持生成这个随机字符串

通过form提交

在form表单里面需要添加{%csrf_token%}

这样当你查看页面源码的时候,可以看到form中有一个input是隐藏的

总结原理:当用户访问login页面的时候,会生成一个csrf的随机字符串,,并且cookie中也存放了这个随机字符串,当用户再次提交数据的时候会带着这个随机字符串提交,如果没有这个随机字符串则无法提交成功

cookie中存放的csrftoken如下图

通过ajax提交

因为cookie中同样存在csrftoken,所以可以在js中通过:

$.cooke("cstftoken")获取

如果通过ajax进行提交数据,这里提交的csrftoken是通过请求头中存放,需要提交一个字典类型的数据,即这个时候需要一个key。

在views中的login函数中:from django.conf import settings,然后打印print(settings.CSRF_HEADER_NAME)

这里需要注意一个问题,这里导入的settings并不是我们在项目文件下看到的settings.py文件,这里是是一个全局的settings配置,而当我们在项目目录下的settings.py中配置的时候,我们添加的配置则会覆盖全局settings中的配置

print(settings.CSRF_HEADER_NAME)打印的内容为:HTTP_X_CSRFTOKEN

这里的HTTP_X_CSRFTOKEN是django在X_CSRF的前面添加了HTTP_,所以实际传递的是就是X_CSRFtoken,而在前端页面的ajax传递的时候由于不能使用下划线所以传递的是X_CSRFtoken

下面是在前端ajax中写的具体内容:

$("#btn1").click(function () {
    $.ajax({
      url:"/login/",
      type:"POST",
      data:{"usr":"root","pwd":"123"},
      headers:{ "X-CSRFtoken":$.cookie("csrftoken")},
      success:function (arg) {

      }
    })
  })

但是如果页面中有多个ajax请求的话就在每个ajax中添加headers信息,所以可以通过下面方式在所有的ajax中都添加

  $.ajaxSetup({
      beforeSend:function (xhr,settings) {
        xhr.setRequestHeader("X-CSRFtoken",$.cookie("csrftoken"))
      }
    });

这样就会在提交ajax之前执行这个方法,从而在所有的ajax里都加上这个csrftoken

这里的xhr是XMLHttpRequest的简写,ajax调用的就是这个方法

如果想要实现在当get方式的时候不需要提交csrftoken,当post的时候需要,实现这种效果的代码如下:

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);
        }
      }
    });

这样就实现了当GET|HEAD|OPTIONS|TRACE这些方式请求的时候不需要提交csrftoken

总结

1、 csrf在ajax提交的时候通过请求头传递的给后台的

2、 csrf在前端的key为:X-CSRFtoken,到后端的时候django会自动添加HTTP_,并且最后为HTTP_X_CSRFtoken

3、 csrf在form中提交的时需要在前端form中添加{%csrftoken%}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击

    一.在django后台处理 1.将django的setting中的加入django.contrib.messages.middleware.MessageMiddleware,一般新建的django项目中会自带的. MIDDLEWARE_CLASSES = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middle

  • Python Django框架防御CSRF攻击的方法分析

    本文实例讲述了Python Django框架防御CSRF攻击的方法.分享给大家供大家参考,具体如下: 项目名/settings.py(项目配置,csrf中间件配置): MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware

  • django框架CSRF防护原理与用法分析

    本文实例讲述了django框架CSRF防护.分享给大家供大家参考,具体如下: CSRF防护 一.什么是CSRF? CSRF: Cross-site request forgery,跨站请求伪造 用户登录了正常的网站A, 然后再访问某恶意网站,该恶意网站上有一个指向网站A的链接,那么当用户点击该链接时,则恶意网站能成功向网站A发起一次请求,实际这个请求并不是用户想发的,而是伪造的,而网站A并不知道. 攻击者利用了你的身份,以你的名义发送恶意请求,比如:以你名义发送邮件,发消息,盗取你的账号,甚至于

  • python Django里CSRF 对应策略详解

    CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的×××方式. 我的理解是,比如你访问过招商银行的网站并登陆之后,你的cookie信息暂时不会失效, 这时,hacker通过各种方式诱导你访问他给你提供的网站等链接,让你在同一浏览器访问 hacker给你的网站时,那么他给你提供的网站里面有直接有向招商银行提交转账信息的请求,这时, 这个转账请求会借用你刚刚登陆过招商银行的cookie信息,来使用的你的身份进行合法的转账. 那么为了减少这个情况的发生,在客

  • Django csrf 验证问题的实现

    关于 csrf 的基本了解 百度百科:CSRF(Cross-site request forgery)跨站请求伪造,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用.通过伪装来自受信任用户的请求来利用受信任的网站. 简单来说就是攻击者盗用你的身份,以你的名义来发送恶意请求.比如说用户通过账号密码访问了网站A,A网站将一些cookie信息保存在浏览器中实现用户状态行为跟踪.这时用户又打开了B网站,B网站返回了一些恶意代码,并请求访问A.这样浏览器就会携带cookie以用户的权限访问A网站并执

  • Django CSRF跨站请求伪造防护过程解析

    前言 CSRF全称Cross-site request forgery(跨站请求伪造),是一种网络的攻击方式,也被称为"One Click Attack"或者Session Riding,通常缩写为CSRF或者XSRF. 攻击原理 1.用户访问正常的网站A,浏览器就会保存网站A的cookies. 2.用户在访问恶意网站B, 网站B上有某个隐藏的链接会自动请求网站A的链接地址,例如表单提交,传指定的参数. 3.恶意网站B的自动化请求,执行就是在用户A的同一个浏览器上,因此在访问网站A的时

  • 详解Django的CSRF认证实现

    什么是 CSRF CSRF, Cross Site Request Forgery, 跨站点伪造请求.举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果某个用户已经登录到你的网站上了,那么当这个用户点击这个恶意网站上的那个链接时,就会向你的网站发来一个请求,你的网站会以为这个请求是用户自己发来的,其实呢,这个请求是那个恶意网站伪造的. 1.csrf原理 csrf要求发送post,put或delete请求的时候,是先以get方式发送请求,服务端响应时会分配一个随机字符串给客户端,客户端第二次

  • Django使用中间键实现csrf认证详解

    Django中的csrf认证实现的原理 调用 process_view 方法 检查视图是否被 @csrf_exempt (免除csrf认证) - 去请求体或cookie中获取token 情况一(全站使用csrf认证,局部不想使用csrf认证) MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.

  • Django中如何防范CSRF跨站点请求伪造攻击的实现

    CSRF概念 CSRF跨站点请求伪造(Cross-Site Request Forgery). 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件.发消息,盗取你的账号,添加系统管理员,甚至于购买商品.虚拟货币转账等. CSRF攻击原理以及过程 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A: 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常

  • Django进阶之CSRF的解决

    简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防跨站请求伪造功能有分为全局和局部. 全局: 中间件 django.middleware.csrf.CsrfViewMiddleware 局部: @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件. @csrf_exempt,取消当前函数防跨站请求伪造功能,即便s

  • 关于django 1.10 CSRF验证失败的解决方法

    最近工作闲,没事自学django,感觉这个最烦的就是各版本提供的api函数经常有变化,不是取消了就是参数没有了,网上搜到的帖子也没说明用的是什么版本的django,所以经常出现搬运过来的代码解决不了问题的情况,不过基本上遇到的坑不多,最坑的就是在提交post表单时弄了两天的CSRF验证失败问题,特此记录一下,我用的是django 1.10.3: 如果你不想使用这个功能,直接找到settings.py中的'django.middleware.csrf.CsrfViewMiddleware',这一行

  • django数据库migrate失败的解决方法解析

    Django是一个MVC架构的web框架,其中,数据库就是"Module".使用这种框架,我们不必写一条SQL语句,就可以完成对数据库的所有操作.在之前的Django版本中,我们像操作本地对象那样操作数据对象,在更改保存之后,执行python manage.py syncdb命令来同步数据库,在我使用的1.9.2版本中,需要依次执行一下步骤: python manage.py makemigrations (这个命令会根据你对数据库做出的更改生成操作数据库的python脚本) pyth

  • 在Django中预防CSRF攻击的操作

    CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造. CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求. ( 包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账-) 造成的问题:个人隐私泄露以及财产安全. CSRF攻击示意图 客户端访问服务器时没有同服务器做安全验证 防止 CSRF 攻击 步骤: 1. 在客户端向后端请求界面数据的时候,后端会往响应中的 cookie 中设置 csrf_token 的值 2. 在 Form 表单中添加

  • 记一次django内存异常排查及解决方法

    起因 Django 作为 Python著名的Web框架,相信很多人都在用,自己工作中也有项目项目在用,而在最近几天的使用中发现,部署Django程序的服务器出现了内存问题,现象就是运行一段时间之后,内存占用非常高,最终会把服务器的内存耗尽,对于Python项目出现内存问题,自己之前处理过一次,所以并没有第一次解决时的慌张,自己之前把解决方法也整理了:https://www.jb51.net/article/151604.htm 但是事情似乎并没有我想的那么简单,自己尝试用之前的的方法tracem

  • 记一次Django响应超慢的解决过程

    在本地windows机器开发的Django项目运行正常,放到服务器上后响应超慢,花了一整个工作日没找到原因(非常绝望),又花了一整个周末才找到原因和临时解决办法,如果你的项目超慢可以参考一下解决思路. 排查过程: 1.怀疑是Python环境问题,到服务器上各种虚拟环境版本进行尝试,无果. 2.因为用了mysql数据库,开始用pymysql包连接改动了一些参数,担心是驱动问题导致数据库查的慢,更换mysqlclient包后,响应依旧慢. 3.担心是有什么报错导致慢,于是艰难地开启了debug模式(

  • Django数据库连接丢失问题的解决方法

    问题 在Django中使用mysql偶尔会出现数据库连接丢失的情况,错误通常有如下两种 OperationalError: (2006, 'MySQL server has gone away') OperationalError: (2013, 'Lost connection to MySQL server during query') 查询mysql全局变量SHOW GLOBAL VARIABLES;可以看到wait_timeout,此变量表示连接空闲时间.如果客户端使用一个连接查询多次数

  • django进阶之cookie和session的使用示例

    Cookies :是浏览器为 Web 服务器存储的一小段信息. 每次浏览器从某个服务器请求页面时,它收到服务器回发送过来的cookies.它保存在浏览器下的某个文件夹下. Session:Django的Session机制会向请求的浏览器发送cookie字符串.同时也会保存到本地一份,用来验证浏览器登录是否为同一用户.它存在于服务器,Django默认会把session存入到数据库中. Session依赖于Cookie,如果浏览器不能保存cookies那么session就失效了.因为它需要浏览器的c

  • Django跨域请求CSRF的方法示例

    web跨域请求 1.为什么要有跨域限制 举个例子: 1.用户登录了自己的银行页面 http://mybank.com,http://mybank.com向用户的cookie中添加用户标识. 2.用户浏览了恶意页面 http://evil.com.执行了页面中的恶意AJAX请求代码. 3.http://evil.com向http://mybank.com发起AJAX HTTP请求,请求会默认把http://mybank.com对应cookie也同时发送过去. 4.银行页面从发送的cookie中提取

随机推荐