Django CSRF跨站请求伪造防护过程解析


Posted in Python onJuly 31, 2019

前言

CSRF全称Cross-site request forgery(跨站请求伪造),是一种网络的攻击方式,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF。

攻击原理

1、用户访问正常的网站A,浏览器就会保存网站A的cookies。

2、用户在访问恶意网站B, 网站B上有某个隐藏的链接会自动请求网站A的链接地址,例如表单提交,传指定的参数。

3、恶意网站B的自动化请求,执行就是在用户A的同一个浏览器上,因此在访问网站A的时候,浏览器会自动带上网站A的cookies。

4、所以网站A在接收到请求之后,可判断当前用户登录状态,所以根据用户的权限做具体的操作逻辑。

防范措施

1、在指定表单或者请求头的里面添加一个随机值做为参数。

2、在响应的cookie里面也设置该随机值。

3、用户正常提交表单的时候会默认带上表单中的随机值,浏览器会自动带上cookie里面的随机值,那么服务器下次接受到请求之后就可以取出两个值进行校验。

4、对于网站B来说网站B在提交表单的时候不知道该随机值是什么,所以就形成不了攻击。

Django中CSRF中间件

django在创建项目的时候,默认就会有添加中间进行CSRF的保护,在MIDDLEWARE可以看到加载了 django.middleware.csrf.CsrfViewMiddleware 的中间件,这里是全局设置,也可以局部设置。

全局保护:直接启用中间件就可以了。

局部保护: from django.views.decorators.csrf import csrf_exempt,csrf_protect ,使用装饰器进行验证。

csrf_protect :为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件;

csrf_exempt :取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

验证

在POST请求提交数据的时候,django会去检查是否有一个csrf的随机字符串,如果没有就会返回403没有权限访问。

表单验证

在form表单里面需要添加{%csrf_token%},Django会自动渲染隐藏的input输入框:

<input type="hidden" name="csrfmiddlewaretoken" value="2Sb0DQwDVgOQ8i3n1BaG1MUPLEYr6ZGaCLYa14maOQM0Ami5ddQOR6hfXuD2mrmA">

在表单提交的时候,中间件会验证csrfmiddlewaretoken。

通过ajax提交

通过cookies获取到csrftoken,

function getCookie(name) {
  var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
  return r ? r[1] : undefined;
}
$.ajax({
  url:"/api/v1.0/orders",
  type:"POST",
  data: JSON.stringify(data),
  contentType: "application/json",
  dataType: "json",
  headers:{
    "X-CSRFtoken":getCookie("csrf_token"),
  },

局部禁用或者启用

1、如果是函数视图,可以直接在函数加上装饰器即可:

from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_exempt
def login(request):
  if request.method == 'GET':
    return render(request,'login.html')
  else:
    return HttpResponse('ok')

2、如果是类视图,需要使用方法装饰器进行封装

from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django.views.generic import TemplateView

@method_decorator(csrf_exempt)
class LoginView(TemplateView):
  template_name = 'login.html'
  def post():
    return HttpResponse('ok')

3、直接装饰as_view()方式,在URLconf里面设置。

from django.views.decorators.csrf import csrf_exempt,csrf_protect
urlpatterns = [
  path('login/', csrf_exempt(LoginView.as_view()),name="login"),
]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python算法学习之桶排序算法实例(分块排序)
Dec 18 Python
python中异常捕获方法详解
Mar 03 Python
python学生管理系统代码实现
Apr 05 Python
Python常见的pandas用法demo示例
Mar 16 Python
python opencv捕获摄像头并显示内容的实现
Jul 11 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
Aug 12 Python
Python集合基本概念与相关操作实例分析
Oct 30 Python
python程序文件扩展名知识点详解
Feb 27 Python
vue学习笔记之动态组件和v-once指令简单示例
Feb 29 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
Aug 11 Python
python爬虫之利用selenium模块自动登录CSDN
Apr 22 Python
Python可视化神器pyecharts之绘制箱形图
Jul 07 Python
在VS2017中用C#调用python脚本的实现
Jul 31 #Python
使用pip安装python库的多种方式
Jul 31 #Python
python实现几种归一化方法(Normalization Method)
Jul 31 #Python
python Django编写接口并用Jmeter测试的方法
Jul 31 #Python
python实现windows倒计时锁屏功能
Jul 30 #Python
python创建属于自己的单词词库 便于背单词
Jul 30 #Python
python中append实例用法总结
Jul 30 #Python
You might like
PHP SPL标准库之SplFixedArray使用实例
2015/05/12 PHP
javascript学习笔记(九) js对象 设计模式
2012/06/19 Javascript
JS判断元素为数字的奇异写法分享
2012/08/01 Javascript
使用jQuery和PHP实现类似360功能开关效果
2014/02/12 Javascript
JS使用replace()方法和正则表达式进行字符串的搜索与替换实例
2014/04/10 Javascript
Javascript json object 与string 相互转换的简单实现
2016/09/27 Javascript
Node.js Sequelize如何实现数据库的读写分离
2016/10/23 Javascript
jQuery日程管理插件fullcalendar使用详解
2017/01/07 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
Javascript实现时间倒计时效果
2017/07/15 Javascript
vue.js声明式渲染和条件与循环基础知识
2017/07/31 Javascript
微信小程序视图template模板引用的实例详解
2017/09/20 Javascript
利用vue+elementUI实现部分引入组件的方法详解
2017/11/22 Javascript
Vue中的v-for指令不起效果的解决方法
2018/09/27 Javascript
对angular4子路由&amp;辅助路由详解
2018/10/09 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)
2019/04/12 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
2020/07/22 Javascript
[02:08]我的刀塔不可能这么可爱 胡晓桃_1
2014/06/20 DOTA
利用Python破解斗地主残局详解
2017/06/30 Python
VSCode下配置python调试运行环境的方法
2018/04/06 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
2018/06/19 Python
python内置数据类型之列表操作
2018/11/12 Python
python获取地震信息 微信实时推送
2019/06/18 Python
Python使用字典实现的简单记事本功能示例
2019/08/15 Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
2019/12/17 Python
基于python检查矩阵计算结果
2020/05/21 Python
Python如何给你的程序做性能测试
2020/07/29 Python
Python高并发和多线程有什么关系
2020/11/14 Python
利用CSS3把图片变成灰色模式的实例代码
2016/09/06 HTML / CSS
Linux文件操作命令都有哪些
2015/02/27 面试题
银行财务部实习生的自我鉴定
2013/11/27 职场文书
幼儿园大班新学期寄语
2014/01/18 职场文书
党的群众路线教育学习材料
2014/05/12 职场文书
领导班子四风问题对照检查材料
2014/09/27 职场文书
SpringBoot SpringEL表达式的使用
2021/07/25 Java/Android