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简单获取自身外网IP的方法
Sep 18 Python
windows上安装Anaconda和python的教程详解
Mar 28 Python
python使用numpy读取、保存txt数据的实例
Oct 14 Python
Pandas DataFrame 取一行数据会得到Series的方法
Nov 10 Python
python打包exe开机自动启动的实例(windows)
Jun 28 Python
python程序中的线程操作 concurrent模块使用详解
Sep 23 Python
numpy:np.newaxis 实现将行向量转换成列向量
Nov 30 Python
40个你可能不知道的Python技巧附代码
Jan 29 Python
python tkinter 设置窗口大小不可缩放实例
Mar 04 Python
Python run()函数和start()函数的比较和差别介绍
May 03 Python
python求解汉诺塔游戏
Jul 09 Python
Django一小时写出账号密码管理系统
Apr 29 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控制网页过期时间的代码
2008/09/28 PHP
一个PHP验证码类代码分享(已封装成类)
2011/07/17 PHP
解析php做推送服务端实现ios消息推送
2013/07/01 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
2013/09/23 PHP
PHP遍历数组的方法汇总
2015/04/30 PHP
用innerhtml提高页面打开速度的方法
2013/08/02 Javascript
JS中的log对象获取以及debug的写法介绍
2014/03/03 Javascript
nodejs教程之环境安装及运行
2014/11/21 NodeJs
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
2015/12/04 Javascript
老生常谈js动态添加事件--- 事件委托
2016/07/19 Javascript
js发送短信倒计时的简单实现方法
2016/09/08 Javascript
NodeJS遍历文件生产文件列表功能示例
2017/01/22 NodeJs
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
js用类封装pop弹窗组件
2017/10/08 Javascript
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
2018/01/16 Javascript
VUE 全局变量的几种实现方式
2018/08/22 Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
2018/09/16 Javascript
详解如何在Javascript中使用Object.freeze()
2020/10/18 Javascript
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
使用Python绘制图表大全总结
2017/02/11 Python
Python标准库之itertools库的使用方法
2017/09/07 Python
python os用法总结
2018/06/08 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
2019/08/14 Python
使用 Python 读取电子表格中的数据实例详解
2020/04/17 Python
Python实现疫情通定时自动填写功能(附代码)
2020/05/27 Python
python excel多行合并的方法
2020/12/09 Python
彻底弄明白CSS3的Media Queries(跨平台设计)
2010/07/27 HTML / CSS
Douglas意大利官网:购买香水和化妆品
2020/05/27 全球购物
2014年有孩子的离婚协议书范本
2014/10/08 职场文书
如何书写公司员工保密协议?
2019/06/27 职场文书
高中语文教材(文学文化常识大全一)
2019/08/13 职场文书
个人房屋租赁合同(标准范本)
2019/09/16 职场文书
MySQL中varchar和char类型的区别
2021/11/17 MySQL
Oracle配置dblink访问PostgreSQL的操作方法
2022/03/21 PostgreSQL
python+pytest接口自动化之token关联登录的实现
2022/04/06 Python