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操作xml文件示例
Apr 07 Python
Python中使用gzip模块压缩文件的简单教程
Apr 08 Python
python实现将内容分行输出
Nov 05 Python
基于Django contrib Comments 评论模块(详解)
Dec 08 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
May 04 Python
Python读取excel中的图片完美解决方法
Jul 27 Python
python文件读写代码实例
Oct 21 Python
Pandas数据离散化原理及实例解析
Nov 16 Python
使用Pandas将inf, nan转化成特定的值
Dec 19 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
Sep 23 Python
Python实现石头剪刀布游戏
Jan 20 Python
再谈python_tkinter弹出对话框创建
Mar 20 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 XML备份Mysql数据库
2009/05/27 PHP
php 读取文件乱码问题
2010/02/20 PHP
非常好用的两个PHP函数 serialize()和unserialize()
2012/02/04 PHP
php中防止恶意刷新页面的代码小结
2012/10/31 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
2015/03/03 PHP
网页设计常用的一些技巧
2006/12/22 Javascript
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
javascript 自定义事件初探
2009/08/21 Javascript
Web 前端设计模式--Dom重构 提高显示性能
2010/10/22 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
2014/06/02 Javascript
javascript+canvas制作九宫格小程序
2014/12/28 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
原生js实现移动端瀑布流式代码示例
2015/12/18 Javascript
JS验证逗号隔开可以是中文字母数字
2016/04/22 Javascript
javascript中数组和字符串的方法对比
2016/07/20 Javascript
javascrit中undefined和null的区别详解
2019/04/07 Javascript
详解package.json版本号规则
2019/08/01 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
[42:00]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第一场 12.13
2020/12/17 DOTA
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
2014/07/04 Python
python实现用户登陆邮件通知的方法
2015/07/09 Python
Python的mysql数据库的更新如何实现
2017/07/31 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
python实现梯度下降算法
2020/03/24 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
2019/07/22 Python
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
Tahari ASL官方网站:高级设计师女装
2021/03/15 全球购物
财务管理专业应届毕业生求职信
2013/09/22 职场文书
总经理助理工作职责
2014/02/06 职场文书
建筑公司员工自我鉴定
2014/04/08 职场文书
自信主题班会
2015/08/14 职场文书
煤矿施工安全协议书
2016/03/22 职场文书
python3美化表格数据输出结果的实现代码
2021/04/14 Python
python实现语音常用度量方法的代码详解
2021/05/25 Python
html输入两个数实现加减乘除功能
2021/07/01 HTML / CSS
python pandas 解析(读取、写入)CSV 文件的操作方法
2022/12/24 Python