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中的id()函数指的什么
Oct 17 Python
使用matplotlib画散点图的方法
May 25 Python
python json.loads兼容单引号数据的方法
Dec 19 Python
python 多个参数不为空校验方法
Feb 14 Python
python做接口测试的必要性
Nov 20 Python
Python 私有化操作实例分析
Nov 21 Python
python3.7通过thrift操作hbase的示例代码
Jan 14 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
Jan 25 Python
使用Django和Postgres进行全文搜索的实例代码
Feb 13 Python
django model通过字典更新数据实例
Apr 01 Python
在keras中实现查看其训练loss值
Jun 16 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
Jun 23 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 has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
php的sso单点登录实现方法
2015/01/08 PHP
yii2实现Ueditor百度编辑器的示例代码
2018/11/02 PHP
JavaScript Event学习第八章 事件的顺序
2010/02/07 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
2013/06/18 Javascript
jquery foreach使用示例
2013/09/12 Javascript
JavaScript中判断两个字符串是否相等的方法
2015/07/07 Javascript
JS截取与分割字符串常用技巧总结
2015/11/10 Javascript
JavaScript继承模式粗探
2016/01/12 Javascript
如何用JS判断两个数字的大小
2016/07/21 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
2016/12/28 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
2020/11/24 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
jQuery实现的上传图片本地预览效果简单示例
2018/03/29 jQuery
React 项目迁移 Webpack Babel7的实现
2018/09/12 Javascript
深入浅析javascript函数中with
2018/10/28 Javascript
vue实现的微信机器人聊天功能案例【附源码下载】
2019/02/18 Javascript
vue设计一个倒计时秒杀的组件详解
2019/04/06 Javascript
koa router 多文件引入的方法示例
2019/05/22 Javascript
echarts多条折线图动态分层的实现方法
2019/05/24 Javascript
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
python实现倒计时的示例
2014/02/14 Python
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
Python中的列表知识点汇总
2015/04/14 Python
Python中的ceil()方法使用教程
2015/05/14 Python
Python实现求数列和的方法示例
2018/01/12 Python
python实现矩阵打印
2019/03/02 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
J2EE模式面试题
2016/10/11 面试题
法律专业自我鉴定
2013/10/03 职场文书
不拖欠农民工工资承诺书
2014/03/31 职场文书
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
文明单位汇报材料
2014/12/24 职场文书
浅析MySQL如何实现事务隔离
2021/06/26 MySQL
Vue的过滤器你真了解吗
2022/02/24 Vue.js