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正则表达式经典入门教程
May 22 Python
Python编程实现二叉树及七种遍历方法详解
Jun 02 Python
Python中xrange与yield的用法实例分析
Dec 26 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
Jun 22 Python
APIStar:一个专为Python3设计的API框架
Sep 26 Python
对Python发送带header的http请求方法详解
Jan 02 Python
对dataframe数据之间求补集的实例详解
Jan 30 Python
详解python配置虚拟环境
Apr 08 Python
python第三方库学习笔记
Feb 07 Python
Tensorflow加载Vgg预训练模型操作
May 26 Python
virtualenv介绍及简明教程
Jun 23 Python
Cpython解释器中的GIL全局解释器锁
Nov 09 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
150kHz到30Mhz完全冲浪手册
2020/03/20 无线电
十天学会php(2)
2006/10/09 PHP
在线短消息收发的程序,不用数据库
2006/10/09 PHP
PHP常用的缓存技术汇总
2014/05/05 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
phpstorm 正则匹配删除空行、注释行(替换注释行为空行)
2018/01/21 PHP
thinkPHP框架乐观锁和悲观锁实例分析
2019/10/30 PHP
js向上无缝滚动,网站公告效果 具体代码
2013/11/18 Javascript
div浮层,滚动条移动,位置保持不变的4种方法汇总
2013/12/11 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
jquery实现手机号码选号的方法
2015/07/31 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
ES6中的数组扩展方法
2016/08/26 Javascript
AngularJS 单选框及多选框的双向动态绑定
2017/04/20 Javascript
js实现简易聊天对话框
2017/08/17 Javascript
使用JS实现气泡跟随鼠标移动的动画效果
2017/09/16 Javascript
基于JavaScript实现简单的音频播放功能
2018/01/07 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
微信小程序扫描二维码获取信息实例详解
2019/05/07 Javascript
layui内置模块layim发送图片添加加载动画的方法
2019/09/23 Javascript
[03:24][TI9纪实] Dota奶爸
2019/08/22 DOTA
python正则匹配查询港澳通行证办理进度示例分享
2013/12/27 Python
如何使用python进行pdf文件分割
2019/11/11 Python
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
python turtle工具绘制四叶草的实例分享
2020/02/14 Python
css3实现文字首尾衔接跑马灯的示例代码
2020/10/16 HTML / CSS
关于解决iframe标签嵌套问题的解决方法
2020/03/04 HTML / CSS
美国专业级皮肤病和spa品质护肤品的高级零售网站:SkinCareRx
2017/02/06 全球购物
IGK Hair官网:喷雾、洗发水、护发素等
2020/11/03 全球购物
大学生关于奋斗的演讲稿
2014/01/09 职场文书
三年级班级文化建设方案
2014/05/04 职场文书
乡镇防汛工作汇报
2014/10/28 职场文书
邀请函范文
2015/02/02 职场文书
2016猴年春节慰问信
2015/11/30 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书
Django 如何实现文件上传下载
2021/04/08 Python