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中的迭代与迭代对象
Oct 08 Python
virtualenv 指定 python 解释器的版本方法
Oct 25 Python
使用k8s部署Django项目的方法步骤
Jan 14 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
Jan 30 Python
python 判断字符串中是否含有汉字或非汉字的实例
Jul 15 Python
Django Docker容器化部署之Django-Docker本地部署
Oct 09 Python
sklearn-SVC实现与类参数详解
Dec 10 Python
解析PyCharm Python运行权限问题
Jan 08 Python
Python 日期的转换及计算的具体使用详解
Jan 16 Python
Python random模块制作简易的四位数验证码
Feb 01 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
Feb 07 Python
基于selenium及python实现下拉选项定位select
Jul 22 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判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
php将日期格式转换成xx天前的格式
2015/04/16 PHP
php实现上传图片文件代码
2015/07/19 PHP
javascript 在网页中的运用(asp.net)
2009/11/23 Javascript
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
2011/06/27 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
JavaScript判断是否为数字的4种方法及效率比较
2015/04/01 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
2016/09/17 Javascript
微信小程序实战之登录页面制作(5)
2020/03/30 Javascript
用vue和node写的简易购物车实现
2017/04/25 Javascript
微信小程序如何获取用户手机号
2018/01/26 Javascript
Angular7创建项目、组件、服务以及服务的使用
2019/02/19 Javascript
vue柱状进度条图像的完美实现方案
2019/08/26 Javascript
Python中的defaultdict模块和namedtuple模块的简单入门指南
2015/04/01 Python
Python3里的super()和__class__使用介绍
2015/04/23 Python
python实现各进制转换的总结大全
2017/06/18 Python
python求质数的3种方法
2018/09/28 Python
Python基础学习之函数方法实例详解
2019/06/18 Python
Python FFT合成波形的实例
2019/12/04 Python
python绘制彩虹图
2019/12/16 Python
python3获取控制台输入的数据的具体实例
2020/08/16 Python
HTML5中的进度条progress元素简介及兼容性处理
2016/06/02 HTML / CSS
EJB面试题
2015/07/28 面试题
化工专业个人的求职信范文
2013/11/28 职场文书
房屋出售授权委托书
2014/10/12 职场文书
夫妻双方自愿离婚协议书
2014/10/24 职场文书
刘公岛导游词
2015/02/05 职场文书
2015年医院创卫工作总结
2015/04/22 职场文书
公司的力量观后感
2015/06/05 职场文书
环境卫生标语
2015/08/03 职场文书
大学生奖学金获奖感言(范文)
2019/08/15 职场文书
评测 | 大屏显示带收音机的高端音箱,JBL TUNE2便携式插卡音箱实测
2021/04/24 无线电
Python 如何利用ffmpeg 处理视频素材
2021/11/27 Python
Java线程的6种状态与生命周期
2022/05/11 Java/Android