Django进阶之CSRF的解决


Posted in Python onAugust 01, 2018

简介

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 相关文章推荐
用Python编写一个简单的FUSE文件系统的教程
Apr 02 Python
python超简单解决约瑟夫环问题
May 12 Python
详解Python中 sys.argv[]的用法简明解释
Dec 20 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
Mar 13 Python
Selenium(Python web测试工具)基本用法详解
Aug 10 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
May 16 Python
python pickle存储、读取大数据量列表、字典数据的方法
Jul 07 Python
python 使用socket传输图片视频等文件的实现方式
Aug 07 Python
django中media媒体路径设置的步骤
Nov 15 Python
简单了解python数组的基本操作
Nov 26 Python
tensorflow实现将ckpt转pb文件的方法
Apr 22 Python
python爬虫中抓取指数的实例讲解
Dec 01 Python
python3利用venv配置虚拟环境及过程中的小问题小结
Aug 01 #Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
Aug 01 #Python
python爬虫自动创建文件夹的功能
Aug 01 #Python
浅谈关于Python3中venv虚拟环境
Aug 01 #Python
python Web开发你要理解的WSGI & uwsgi详解
Aug 01 #Python
Django教程笔记之中间件middleware详解
Aug 01 #Python
flask框架中勾子函数的使用详解
Aug 01 #Python
You might like
收音机史话 - 1960年代前后的DIY
2021/03/02 无线电
php session 预定义数组
2009/03/16 PHP
web server使用php生成web页面的三种方法总结
2013/10/28 PHP
php str_replace替换指定次数的方法详解
2017/05/05 PHP
Yii框架参数配置文件params用法实例分析
2019/09/11 PHP
php实例化一个类的具体方法
2019/09/19 PHP
基于laravel belongsTo使用详解
2019/10/18 PHP
自己的js工具_Form 封装
2009/08/21 Javascript
js仿百度有啊通栏展示效果实现代码
2013/05/28 Javascript
当json键为数字时的取值方法解析
2013/11/15 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
2014/02/19 Javascript
原生的html元素选择器类似jquery选择器
2014/10/15 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
2015/01/09 Javascript
js实现感应鼠标图片透明度变化的方法
2015/02/20 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
2016/05/31 Javascript
js实现二级导航功能
2017/03/03 Javascript
vuecli项目构建SSR服务端渲染的实现
2020/10/30 Javascript
python通过ElementTree操作XML获取结点读取属性美化XML
2013/12/02 Python
python中字典dict常用操作方法实例总结
2015/04/04 Python
python 排序算法总结及实例详解
2016/09/28 Python
Windows下python3.7安装教程
2018/07/31 Python
如何通过Django使用本地css/js文件
2020/01/20 Python
使用Python实现牛顿法求极值
2020/02/10 Python
Python表达式的优先级详解
2020/02/18 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
员工自我鉴定
2013/10/09 职场文书
快递业务员岗位职责
2014/01/06 职场文书
银行纠风工作实施方案
2014/06/08 职场文书
2014年安全生产目标责任书
2014/07/23 职场文书
运动会跳远广播稿5篇
2014/09/17 职场文书
云台山导游词
2015/02/03 职场文书
2015年初三班主任工作总结
2015/05/21 职场文书
初一军训感言
2015/08/01 职场文书
2016简单的租房合同范本
2016/03/18 职场文书
小型企业的绩效考核制度模板
2019/11/21 职场文书
详解Python类和对象内容
2021/06/22 Python