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 参数列表中的self 显式不等于冗余
Dec 01 Python
Python实现将不规范的英文名字首字母大写
Nov 15 Python
Python处理PDF及生成多层PDF实例代码
Apr 24 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
Jan 10 Python
python 筛选数据集中列中value长度大于20的数据集方法
Jun 14 Python
python实现微信自动回复及批量添加好友功能
Jul 03 Python
在Django的View中使用asyncio的方法
Jul 12 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
Jul 31 Python
Django restframework 框架认证、权限、限流用法示例
Dec 21 Python
tensorflow中tf.slice和tf.gather切片函数的使用
Jan 19 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 Python
python多线程方法详解
Jan 18 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实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
symfony2.4的twig中date用法分析
2016/03/18 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
xml和web特殊字符
2009/04/28 Javascript
基于jquery的一行代码轻松实现拖动效果
2010/12/28 Javascript
一款Jquery 分页插件的改造方法(服务器端分页)
2011/07/11 Javascript
js点击页面其它地方将某个显示的DIV隐藏
2012/07/12 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
javascript中select下拉框的用法总结
2016/01/07 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
JavaScript中Object值合并方法详解
2017/12/22 Javascript
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
2018/08/22 Javascript
element ui 表格动态列显示空白bug 修复方法
2018/09/04 Javascript
Vue的click事件防抖和节流处理详解
2019/11/13 Javascript
jquery将信息遍历到界面上实例代码
2020/01/21 jQuery
在vue中封装方法以及多处引用该方法详解
2020/08/14 Javascript
[03:36]DOTA2完美大师赛coL战队趣味视频——我演你猜
2017/11/23 DOTA
Python多线程编程(一):threading模块综述
2015/04/05 Python
Python自动化测试ConfigParser模块读写配置文件
2016/08/15 Python
Python文件操作基本流程代码实例
2017/12/11 Python
Python实现的摇骰子猜大小功能小游戏示例
2017/12/18 Python
分享8点超级有用的Python编程建议(推荐)
2019/10/13 Python
萨克斯第五大道的折扣店:Saks Fifth Avenue OFF 5TH
2016/08/25 全球购物
教师实习自我鉴定
2013/12/11 职场文书
高中生学习的自我评价
2013/12/14 职场文书
单位实习证明怎么写
2014/01/17 职场文书
水电站项目建议书
2014/05/12 职场文书
房屋租赁协议书
2014/10/18 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
党员承诺书格式范文
2015/04/28 职场文书
教师节祝酒词
2015/08/11 职场文书
Python-OpenCV实现图像缺陷检测的实例
2021/06/11 Python
nginx实现动静分离的方法示例
2021/11/07 Servers
面试被问select......for update会锁表还是锁行
2021/11/11 MySQL
Vue.Draggable实现交换位置
2022/04/07 Vue.js