前言

用过Django 进行开发的同学都知道,Django框架天然支持对CSRF攻击的防护,因为其内置了一个名为CsrfViewMiddleware的中间件,其基于Cookie方式的防护原理,相比基于session的方式,更适合目前前后端分离的业务场景,但美中不足的是,其生成的csrf_token在一个session周期中是不变,这对于一些特定的业务场景,显然有点遗憾。

为了弥补这个遗憾,本文介绍一种不用修改CsrfViewMiddleware中间件源码的方式,实现基于请求的csrf_token更新方式,详文如下。

实现过程

1、Django csrf 校验的两个场景

在业务场景中,有两种不同的csrf防护场景,一种是基于Form 表单提交数据的防护,一种是基于ajax 异步请求数据的防护。

对于Form 表单,可以通过在表单中内置`{% csrf_token %}` 实现在提交数据时一起携带csrf_token提交上去,从而通过后端csrf 校验。

这里顺便提下 Django模板引擎是如何渲染`{% csrf_token %}`的,其实就是将`{% csrf_token %}` 替换成csrf_input的返回值(这点可从Django 模板引擎源码中找到),如下:

而get_token则是从request.META['CSRF_COOKIE']中获取:

对于ajax 请求,需要在提交请求的时候,添加一个名为x-csrftoken的头部(这个头部是Django源码中内定的),值为从cookie中提取的指定name的值,这个name可自定义,比如下图为`csrf-bastion`:

2、Django csrf token 的生成流程

主要关注下CsrfViewMiddleware 中间件的process_view和process_response。

process_view的主要功能之一就是从请求的cookie中提取指定name的(通过settings.CSRF_COOKIE_NAME指定)cookie值为:csrf token,然后赋值给request.META['CSRF_COOKIE'],如果从请求头中提取不到,则重新生成,如下图:

process_response 中会有更新csrf token cookie的功能,如下:

3、 通过在视图中修改request.META['CSRF_COOKIE']值实现csrf token 的更新

通过1和2我们就可以知道只要在在response返回之前更新request.META['CSRF_COOKIE']的值,便可以实现每次请求的csrf token 都不一样,当然可以通过修改CsrfViewMiddleware中间件源码的方式实现,不过这种方式的入侵性太大,最好的选择是在视图中修改,因为视图处理流程是在response之前进行,如下:

这里的rotate_token则是CsrfViewMiddleware 中间件提供的更新csrf token的接口,如下:

总结

本文提到的这个方法确实可以实现基于请求对csrf_token值进行更新,而不是原先的基于session的,这样更新之后,对于ajax请求倒是没有什么问题,不过对于From表单中csrf_token值的更新是需要进行后端渲染更新的,对于前后端分离的请求,这个不足是可以让后端提供个token 获取接口来实现前端页面中form表单的csrf_token值更新实现,当然也可以对form表单的提交行为进行监听,然后异步提交,这样直接走ajax那条路线,就没啥问题了。

转载于:https://www.cnblogs.com/h2zZhou/p/9776270.html

安全开发 | 如何让Django框架中的CSRF_Token的值每次请求都不一样相关推荐

  1. Windows上python开发--2安装django框架

    Windows上python开发--2安装django框架 分类: 服务器后台开发2014-05-17 21:22 2310人阅读 评论(2) 收藏 举报 python django 上一篇文章中讲了 ...

  2. mysql 中的neq_mysql中neq使用Python的Django框架中的压缩组件Django Compressor_MySQL

    为了加快网站的加载速度,我们通常要多js和css进行压缩处理.这些js和css的压缩工作如果都手动处理,费时费力. <mysql中neq使用Python的Django框架中的压缩组件Django ...

  3. ajax校验的优点,django框架中ajax的使用及避开CSRF 验证的方式详解

    本文实例讲述了django框架中ajax的使用及避开CSRF 验证的方式.分享给大家供大家参考,具体如下: ajax(Asynchronous Javascript And Xml) 异步javasc ...

  4. Python的Django框架中forms表单类的使用方法详解2

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  5. python django开发api_基于Django框架开发Restful api

    在上篇文章中,我们讲解了restful api的主要概念,让大家有初步的了解.这一篇中,我们将通过python的Django框架,来学习开发restful 架构的接口. 一. 开发环境 开发语言:Py ...

  6. django框架中的模型

    文章目录 关联关系 Many-to-one relationships Many-to-many relationships¶ django学习--model中的get和filter方法的区别 模型 ...

  7. python日期选择框_Python的Django框架中设置日期和字段可选的方法

    设置字段可选 在摆弄了一会之后,你或许会发现管理工具有个限制:编辑表单需要你填写每一个字段,然而在有些情况下,你想要某些字段是可选的. 举个例子,我们想要Author模块中的email字段成为可选,即 ...

  8. java socket中属性详解_前端开发:关于Vue组件中的data属性值是函数而不是对象的详解...

    最近在搞关于前端开发的基础知识归纳,发现了不少经典知识点,那么本篇博文就来分享一个经典的知识点:Vue组件中的data属性值为什么是函数而不是对象.首先来了解一下Vue组件的使用理念:在Vue组件使用 ...

  9. python pipeline框架_介绍Python的Django框架中的静态资源管理器django-pipeline

    django-pipeline 是一个 Django 下非常方便的静态资源管理 app,尤其是 1.2 版本之后,利用 django-staticfiles 的collectstatic 命令,在开发 ...

最新文章

  1. this super 在接口以及实现类中所指的对象
  2. 测试:VS2010的Coded UI Test参考内容列表
  3. Python切片中的误区与高级用法
  4. 比较简单的创造印象派画风的网站
  5. java默认代码地址_Java 8默认方法可能会破坏您的(用户)代码
  6. windows下运用git bash 通过ssh方式连接到git server
  7. 【渝粤教育】国家开放大学2018年春季 0239-21T电子商务物流管理 参考试题
  8. 【LeetCode】【字符串】题号:*539. 最小时间差
  9. 基于boost库的搜索引擎项目
  10. 微信突然限制,你的小程序链接还好吗?
  11. ArcGIS简单出图
  12. 局域网连接外网时,二级路由器设置
  13. 再谈斐波那契,把数字翻译成字符串
  14. 首席商学院新媒体运营创始人黎想:爆火抖音短视频,打造技巧分析
  15. 110报警声+单片机c语言,基于单片机的红外报警系统设计毕业论文.docx
  16. app免填邀请码安装如何实现?
  17. 女朋友学计算机送什么礼物好,送经常面对电脑的女生什么礼物?
  18. abs 三种功能及代码详解 matlab函数
  19. 京东商品详情APP原数据API接口-(item_get_app-获得JD商品详情原数据API接口),京东API接口
  20. vue 组件 Vue.component 用法

热门文章

  1. 计算机无法打开策略,Win10提示“无法打开此计算机上的组策略对象”如何解决...
  2. scipy是python下的什么_SciPy是什么
  3. 在struts2中push方法的使用_电脑使用中怎么截屏的几种方法
  4. ggplot2设置坐标轴范围_R语言数据可视化| ggplot2中会“分身术”的facet_wrap()与facet_grid()...
  5. mssql导出数据到mysql_MSSQL数据导出到MYSQL
  6. pyplot绘制图片_matplotlib系列之pyplot
  7. flask 检测post是否为空_使用Flask搭建一个校园论坛-4
  8. 父类一实现serializable_我的java基础学习易错点和易忘点总结(一)
  9. 优化方案电子版_关于小区分支道路整修设计方案的讨论稿(No.2020121)
  10. 加油站会员管理系统源码php_加油站使用会员管理系统,如何解决行业瓶颈?