django框架CSRF防护原理及实例用法

  • 时间:
  • 9923人关注

这篇文章主要介绍了django框架CSRF防护原理与用法,结合实例形式分析了Django框架CSRF防护的概念、原理、使用方法及相关操作注意事项,需要的朋友可以参考下,另外这篇文章主要知识点是关于django框架、CSRF防护、django、django框架的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子资料:

教程详情电子资料
  • 教程类别:django框架
  • 编辑整理:从星洲
  • 教程字数:866字节
  • 阅读时间:大概18分钟
  • 下载本教程(DOC版)
  • Python高效开发实战:Django、Tornado、Flask、Twisted
  • Django Rest Framework 教程
  • Django 3.0官方文档
  • 轻量级Django
  • Python新手使用Django架站的16堂课
  • 本文实例讲述了django框架CSRF防护。分享给大家供大家参考,具体如下:

    CSRF防护

    一、什么是CSRF?

    CSRF: Cross-site request forgery,跨站请求伪造

    用户登录了正常的网站A, 然后再访问某恶意网站,该恶意网站上有一个指向网站A的链接,那么当用户点击该链接时,则恶意网站能成功向网站A发起一次请求,实际这个请求并不是用户想发的,而是伪造的,而网站A并不知道。

    攻击者利用了你的身份,以你的名义发送恶意请求,比如:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账等。

    如果想防止CSRF,首先是重要的信息传递都采用POST方式而不是GET方式,接下来就说POST请求的攻击方式以及在Django中的避免

    二、CSRF攻击演示

    步骤1:登录成功后进入发帖界面,进行发帖(使用post请求发帖,测试时先关闭csrf中间件)

    步骤2:限制登录成功后才能发帖

    • 可通过session保存登录成功的用户名
    • 判断session中是否有保存用户名,有才允许发帖

    步骤3:CSRF攻击演示

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

    三、CSRF防护

    重要信息如金额、积分等的获取,采用POST请求

    开启CSRF中间件(默认就是开启的)

    # 项目下的setting.py
    MIDDLEWARE_CLASSES = (
      ...
      # 开启csrf中间件(默认是开启的)
      'django.middleware.csrf.CsrfViewMiddleware',
      ...
    )
    
    

    表单post提交数据时加上 {% csrf_token %} 标签

    四、防御原理【了解】

    1. 服务器在渲染模板文件时,会在html页面中生成一个名字叫做 csrfmiddlewaretoken 的隐藏域。
    2. 服务器会让浏览器保存一个名字为 csrftoken 的cookie信息
    3. post提交数据时,两个值都会发给服务器,服务器进行比对,如果一样,则csrf验证通过,否则提示403 Forbidden

    希望本文所述对大家基于Django框架的Python程序设计有所帮助。

    码农之家
    Django进阶之CSRF的解决

    15小时15分钟前回答

    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进阶之CSRF的解决

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

    通过form提交

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

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

    Django进阶之CSRF的解决

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

    cookie中存放的csrftoken如下图

    Django进阶之CSRF的解决

    通过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%}

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

    展开阅读

    上一篇:Python实现网页截图的实例

    下一篇:Pandas中resample方法示例代码

    相关内容

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

      这篇文章主要介绍了Django跨域请求CSRF的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

      06-24Django跨域请求CSRF详解

      阅读更多
    • 跟老齐学Python:Django实战

      跟老齐学Python:Django实战

      《跟老齐学Python:Django实战》是以Python为基础进行Web应用开发的进阶读物。适合已经具有Python基础技能、进行Web应用开发的读者。感兴趣的小伙伴们可以下载参考一下

      大小:151 MBPython

      点击下载
    • Django企业开发实战:高效Python Web框架指南

      Django企业开发实战:高效Python Web框架指南

      这书以从零开始开发设计1个博客系统为例,详细介绍Django在平时工作上的运用。这书共分成四一部分。*一部分详细介绍编号以前的提前准备工作中,包含需求分析报告、Web开发设计基本及其电

      大小:161.7 MBDjango

      点击下载
    • Django实战:Python Web典型模块与项目开发

      Django实战:Python Web典型模块与项目开发

      本书结合样例,介绍 Django 的基础知识、主要模块的开发以及权限管理等高级内容,并且通过图书管理系统、博客系统、车费管理系统 3 个项目的开发实战,使读者既能掌握 Django 的重要开发技术,又能对这些知识在项目中的综合应用有深入了解。 本书共有 16 章,分为 3 个篇章,准备篇介绍了 Web 框架以及 Django 的基本知识;入门篇详细讲解了路由系统、模板系统等5 个主要模块的开发过程,并通过图书管理系统和博客系统的开发综合应用这些知识;进阶

      大小:58 MBDjango

      点击下载
    • Django2.2 官方文档

      Django2.2 官方文档

      Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。 Django是一个开放源代码的Web应用框架,由Python写成。采用了MVT的软件设计模式,即模型Model,视图View和模板Template。 Django 最初被设计用于具有快速开发需求的新闻类站点,目的是要实现简单快捷的网站开发。通过手把手地方式教你一步步的创建一个 Web 应用。如果你初学 Django 或编程,请从这里开始。 如果你初次了解 Python,可能想

      大小:11 MBDjango

      点击下载

    学习笔记

    28小时10分钟前回答

    django的csrf实现过程详解

    如果是ajax提交,可以按照下面的方式处理 script src="/static/jq/jquery-3.3.1.js"/script script src="/static/jq/jquery.cookie.js"/script script $(function () { ajax_buttion() }) function ajax_buttion() { $("#btn").bind("click",function () { $.ajax( { url:"/test/app1/", type:"post", data:{ username:"root", pwd:"admin" }, headers:{ "X-CSRFToken":$.cookie("csrftoken") }, sucess:function (data) { console.log(data) } } ) }) } /script 可以设置一个全局的设置,然后在$(function){ }中执行函数 $(function () { ajax_buttion() $.ajaxSetup()}) 如果是form表单提交,则可以按照下面的方式处理 form action="/test/app1/" method="post" {% csrf_token %} input type="text" name="uname" input type="submit" value="submit" input type="button" value="ajax" id="btn"/f……

    19小时51分钟前回答

    Django中针对基于类的视图添加csrf_exempt实例代码

    在Django中对于基于函数的视图我们可以 @csrf_exempt 注解来标识一个视图可以被跨域访问。那么对于基于类的视图,我们应该怎么办呢? 简单来说可以有两种访问来解决 方法一 在类的 dispatch 方法上使用 @csrf_exempt from django.views.decorators.csrf import csrf_exemptclass MyView(View): def get(self, request): return HttpResponse("hi") def post(self, request): return HttpResponse("hi") @csrf_exempt def dispatch(self, *args, **kwargs): return super(MyView, self).dispatch(*args, **kwargs) 方法二 在 urls.py 中配置 from django.conf.urls import urlfrom django.views.decorators.csrf import csrf_exemptimport viewsurlpatterns = [ url(r'^myview/$', csrf_exempt(views.MyView.as_view()), name='myview'),] 总结 以上就是本文关于……

    44小时3分钟前回答

    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中提取用户标识,验证用户无误,response中返回请求数据。此时数据就泄露了。 5.而且由于Ajax在后台执行,用户无法感知这一过程。 以上就是所谓是CSRF(Cross-site request forgery)攻击,跨站请求伪造。接下来说一下 Django中处理csrf的方式 正常情况下直接发起一个psot请求,会报……