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下使用状态机的教程
Apr 11 Python
python遍历数组的方法小结
Apr 30 Python
Python制作豆瓣图片的爬虫
Dec 28 Python
python编辑用户登入界面的实现代码
Jul 16 Python
使用Python处理BAM的方法
Sep 28 Python
Python Pillow Image Invert
Jan 22 Python
使用Python正则表达式操作文本数据的方法
May 14 Python
对Python中class和instance以及self的用法详解
Jun 26 Python
python的几种矩阵相乘的公式详解
Jul 10 Python
pytorch中的transforms模块实例详解
Dec 31 Python
python实现爱奇艺登陆密码RSA加密的方法示例详解
May 27 Python
Python使用Matlab命令过程解析
Jun 04 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
模仿OSO的论坛(五)
2006/10/09 PHP
laravel安装和配置教程
2014/10/29 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
2015/11/10 PHP
PHP+swoole实现简单多人在线聊天群发
2016/01/19 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
日期函数扩展类Ver0.1.1
2006/09/07 Javascript
不懂JavaScript应该怎样学
2008/04/16 Javascript
利用函数的惰性载入提高javascript代码执行效率
2014/05/05 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
Jquery中$.post和$.ajax的用法小结
2015/04/28 Javascript
基于JavaScript实现表单密码的隐藏和显示出来
2016/03/02 Javascript
分享jQuery网页元素拖拽插件
2020/12/01 Javascript
Bootstrap模态框调用功能实现方法
2016/09/19 Javascript
原生JS实现匀速图片轮播动画
2016/10/18 Javascript
js实现登录与注册界面
2017/11/01 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
2019/05/07 Javascript
解决antd 下拉框 input [defaultValue] 的值的问题
2020/10/31 Javascript
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
[03:17]DOTA2-DPC中国联赛1月29日Recap集锦
2021/03/11 DOTA
Python内置函数dir详解
2015/04/14 Python
Python hashlib模块用法实例分析
2018/06/12 Python
python画微信表情符的实例代码
2019/10/09 Python
Django将默认的SQLite更换为MySQL的实现
2019/11/18 Python
Python While循环语句实例演示及原理解析
2020/01/03 Python
Python3实现mysql连接和数据框的形成(实例代码)
2020/01/17 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
django使用JWT保存用户登录信息
2020/04/22 Python
Keras实现支持masking的Flatten层代码
2020/06/16 Python
keras实现图像预处理并生成一个generator的案例
2020/06/17 Python
HTML5引入的新数组TypedArray介绍
2012/12/24 HTML / CSS
酒吧员工的岗位职责
2013/11/26 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
教师节获奖感言
2015/07/31 职场文书
Golang 实现获取当前函数名称和文件行号等操作
2021/05/08 Golang
浅谈mysql返回Boolean类型的几种情况
2021/06/04 MySQL