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 相关文章推荐
35个Python编程小技巧
Apr 01 Python
python使用KNN算法手写体识别
Feb 01 Python
对python GUI实现完美进度条的示例详解
Dec 13 Python
python统计中文字符数量的两种方法
Jan 31 Python
pyqt远程批量执行Linux命令程序的方法
Feb 14 Python
详解Python:面向对象编程
Apr 10 Python
我们为什么要减少Python中循环的使用
Jul 10 Python
Django认证系统实现的web页面实现代码
Aug 12 Python
浅析PEP572: 海象运算符
Oct 15 Python
发工资啦!教你用Python实现邮箱自动群发工资条
May 10 Python
pytorch--之halfTensor的使用详解
May 24 Python
python字符串的一些常见实用操作
Apr 06 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
PDO实现学生管理系统
2020/03/21 PHP
Opacity.js
2007/01/22 Javascript
在线编辑器的实现原理(兼容IE和FireFox)
2007/03/09 Javascript
【消息提示组件】,兼容IE6/7&&FF2
2007/09/04 Javascript
css transform 3D幻灯片特效实现步骤解读
2013/03/27 Javascript
谈一谈javascript中继承的多种方式
2016/02/19 Javascript
JavaScript学习笔记之数组求和方法
2016/03/23 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
2016/09/12 Javascript
使用JQuery中的trim()方法去掉前后空格
2016/09/16 Javascript
js实现多张图片延迟加载效果
2017/07/17 Javascript
浅谈对Angular中的生命周期钩子的理解
2017/07/31 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
详解Vue源码学习之双向绑定
2019/04/10 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
Python获取运行目录与当前脚本目录的方法
2015/06/01 Python
Python2.x利用commands模块执行Linux shell命令
2016/03/11 Python
Python作用域用法实例详解
2016/03/15 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
Python 解析简单的XML数据
2020/07/24 Python
python获取linux系统信息的三种方法
2020/10/14 Python
浅谈matplotlib默认字体设置探索
2021/02/03 Python
Juice Beauty官网:有机美容产品,护肤与化妆品
2020/06/13 全球购物
一套Java笔试题
2016/08/20 面试题
采购员的工作职责
2013/12/26 职场文书
草船借箭教学反思
2014/02/03 职场文书
统计系教授推荐信
2014/02/28 职场文书
2015年新农合工作总结
2015/03/30 职场文书
保险内勤岗位职责
2015/04/13 职场文书
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
2021/04/06 Oracle
Python 用户输入和while循环的操作
2021/05/23 Python
SpringCloud之@FeignClient()注解的使用方式
2021/09/25 Java/Android
MySQL中一条update语句是如何执行的
2022/03/16 MySQL
联想win10摄像头打不开怎么办?win10笔记本摄像头打不开解决办法
2022/04/08 数码科技