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处理文本文件实现生成指定格式文件的方法
Jul 31 Python
在centos7中分布式部署pyspider
May 03 Python
Python+tkinter模拟“记住我”自动登录实例代码
Jan 16 Python
Python爬取数据并写入MySQL数据库的实例
Jun 21 Python
Python 列表去重去除空字符的例子
Jul 20 Python
Python编写打字训练小程序
Sep 26 Python
python运用sklearn实现KNN分类算法
Oct 16 Python
python Canny边缘检测算法的实现
Apr 24 Python
python装饰器代码深入讲解
Mar 01 Python
python基础之模块的导入
Oct 24 Python
Python 中的 copy()和deepcopy()
Nov 07 Python
移除Selenium中window.navigator.webdriver值
Jun 10 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
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
2019/10/15 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
javascript 函数使用说明
2010/04/07 Javascript
基于jquery的web页面日期格式化插件
2011/11/15 Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
2013/10/16 Javascript
javascript获取URL参数与参数值的示例代码
2013/12/20 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
JS中自定义定时器让它在某一时刻执行
2014/09/02 Javascript
js验证身份证号有效性并提示对应信息
2015/10/19 Javascript
有关Promises异步问题详解
2015/11/13 Javascript
Bootstrap table使用方法总结
2017/05/10 Javascript
js实现动态添加上传文件页面
2018/10/22 Javascript
python处理cookie详解
2014/02/07 Python
讲解Python中的标识运算符
2015/05/14 Python
Python进程间通信用法实例
2015/06/04 Python
分数霸榜! python助你微信跳一跳拿高分
2018/01/08 Python
python抓取网页中链接的静态图片
2018/01/29 Python
Windows下python3.6.4安装教程
2018/07/31 Python
Python实现井字棋小游戏
2020/03/09 Python
Python xlwt模块使用代码实例
2020/06/10 Python
对python pandas中 inplace 参数的理解
2020/06/27 Python
解决python对齐错误的方法
2020/07/16 Python
HTML5自定义元素播放焦点图动画的实现
2019/09/25 HTML / CSS
加拿大著名时装品牌:SOIA & KYO
2016/08/23 全球购物
Interhome丹麦:在线预订度假屋和公寓
2019/07/18 全球购物
土木工程专业个人求职信
2013/12/05 职场文书
餐厅销售主管职责范本
2014/02/19 职场文书
警察先进个人事迹材料
2014/05/16 职场文书
安全施工责任书
2014/08/25 职场文书
2015建军节87周年演讲稿
2015/03/19 职场文书
2015年高校教师个人工作总结
2015/05/25 职场文书
2015中秋节晚会主持词
2015/07/01 职场文书
springboot入门 之profile设置方式
2022/04/04 Java/Android