Django跨域请求CSRF的方法示例


Posted in Python onNovember 11, 2018

web跨域请求

1.为什么要有跨域限制

举个例子:

1.用户登录了自己的银行页面 http://mybank.com,http://mybank.com向用户的cookie中添加用户标识。
2.用户浏览了恶意页面 http://evil.com。执行了页面中的恶意AJAX请求代码。
3.http://evil.com向http://mybank.com发起AJAX HTTP请求,请求会默认把http://mybank.com对应cookie也同时发送过去。
4.银行页面从发送的cookie中提取用户标识,验证用户无误,response中返回请求数据。此时数据就泄露了。
5.而且由于Ajax在后台执行,用户无法感知这一过程。

以上就是所谓是CSRF(Cross-site request forgery)攻击,跨站请求伪造。接下来说一下 Django中处理csrf的方式

正常情况下直接发起一个psot请求,会报错。错误的意思是csrf校验失败,request请求被丢弃掉。

那么在django中的post失败有两种解决办法:

解决办法一:将csrf中间层注释掉

MIDDLEWARE = [
 
  'django.middleware.security.SecurityMiddleware',
 
  'django.contrib.sessions.middleware.SessionMiddleware',
 
  'django.middleware.common.CommonMiddleware',
 
#  'django.middleware.csrf.CsrfViewMiddleware',
 
  'django.contrib.auth.middleware.AuthenticationMiddleware',
 
  'django.contrib.messages.middleware.MessageMiddleware',
 
  'django.middleware.clickjacking.XFrameOptionsMiddleware',
 
]

此时将不会进行csrf的校验,但如前面所述,这是一种不安全的行为。而且djano也不推荐使用

解决办法二:

在前面的提示中有这样一句话:

<form action="" method="post">{% csrf_token %}

也就是说在网页中加入csrf_token的标签就可以通过csrf校验

Django 提供的 CSRF 防护机制:

1、django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token,这样就能避免被 CSRF 攻击。

2、在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token,在所有的 POST 表单时,必须包含一个 csrfmiddlewaretoken 字段 (只需要在模板里加一个 tag, django 就会自动帮你生成,见下面)

3、在处理 POST 请求之前,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden.

4、在所有 ajax POST 请求里,添加一个 X-CSRFTOKEN header,其值为 cookie 里的 csrftoken 的值

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

Python 相关文章推荐
浅谈python对象数据的读写权限
Sep 12 Python
Python获取当前公网ip并自动断开宽带连接实例代码
Jan 12 Python
Python判断变量名是否合法的方法示例
Jan 28 Python
python面试题小结附答案实例代码
Apr 11 Python
Django框架实现分页显示内容的方法详解
May 10 Python
numpy数组广播的机制
Jul 12 Python
python中的global关键字的使用方法
Aug 20 Python
python3的数据类型及数据类型转换实例详解
Aug 20 Python
Python爬虫运用正则表达式的方法和优缺点
Aug 25 Python
tensorflow模型转ncnn的操作方式
May 25 Python
利用scikitlearn画ROC曲线实例
Jul 02 Python
Python logging日志库空间不足问题解决
Sep 14 Python
Python rstrip()方法实例详解
Nov 11 #Python
python requests爬取高德地图数据的实例
Nov 10 #Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 #Python
Python中的取模运算方法
Nov 10 #Python
在Python中获取两数相除的商和余数方法
Nov 10 #Python
Python解决两个整数相除只得到整数部分的实例
Nov 10 #Python
从DataFrame中提取出Series或DataFrame对象的方法
Nov 10 #Python
You might like
php中用date函数获取当前时间有误的解决办法
2013/08/02 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
2016/09/23 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
2017/09/01 PHP
laravel-admin 实现给grid的列添加行数序号的方法
2019/10/08 PHP
浅谈laravel orm 中的一对多关系 hasMany
2019/10/21 PHP
Flash对联广告的关闭按钮讨论
2007/01/30 Javascript
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList
2012/02/03 Javascript
关于scrollLeft,scrollTop的浏览器兼容性测试
2013/03/19 Javascript
jquery实现仿JqueryUi可拖动的DIV实例
2015/07/31 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
Bootstrap 3多级下拉菜单实例
2017/11/23 Javascript
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
extract-text-webpack-plugin用法详解
2019/02/14 Javascript
vue视频播放插件vue-video-player的具体使用方法
2019/11/08 Javascript
vue用elementui写form表单时,在label里添加空格操作
2020/08/13 Javascript
js实现移动端轮播图滑动切换
2020/12/21 Javascript
Python实现获取域名所用服务器的真实IP
2015/10/25 Python
python中安装Scrapy模块依赖包汇总
2017/07/02 Python
Python里字典的基本用法(包括嵌套字典)
2019/02/27 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
学习和使用python的13个理由
2019/07/30 Python
Django框架 信号调度原理解析
2019/09/04 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
2020/02/25 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
2020/06/12 Python
农行实习自我鉴定
2013/09/22 职场文书
优秀员工自荐书
2013/12/19 职场文书
经典广告词大全
2014/03/14 职场文书
软件工程毕业生自荐信
2014/07/04 职场文书
2014年妇联工作总结
2014/11/21 职场文书
综合测评自我评价
2015/03/06 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android