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使用bs4获取58同城城市分类的方法
Jul 08 Python
python编写简单爬虫资料汇总
Mar 22 Python
利用Celery实现Django博客PV统计功能详解
May 08 Python
python实现微信远程控制电脑
Feb 22 Python
Python多图片合并PDF的方法
Jan 03 Python
python实现随机漫步方法和原理
Jun 10 Python
用django设置session过期时间的方法解析
Aug 05 Python
python采集百度搜索结果带有特定URL的链接代码实例
Aug 30 Python
利用Python的sympy包求解一元三次方程示例
Nov 22 Python
Python 内置函数globals()和locals()对比详解
Dec 23 Python
python print 格式化输出,动态指定长度的实现
Apr 12 Python
简单介绍Python的第三方库yaml
Jun 18 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 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
PHP递归复制、移动目录的自定义函数分享
2014/11/18 PHP
PHP版QQ互联OAuth示例代码分享
2015/07/05 PHP
php获取远程文件大小
2015/10/20 PHP
phpcms的分类名称和类别名称的调用
2017/01/05 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
js下弹出窗口的变通
2007/04/18 Javascript
js数字输入框(包括最大值最小值限制和四舍五入)
2009/11/24 Javascript
node.js集成百度UE编辑器
2015/02/05 Javascript
JavaScript设计模式之工厂模式和构造器模式
2015/02/11 Javascript
基于javascript简单实现对身份证校验
2021/01/25 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
轻松掌握JavaScript中介者模式
2016/08/26 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
JS实现带动画的回到顶部效果
2017/12/28 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
2018/04/28 Javascript
webpack4的迁移的使用方法
2018/05/25 Javascript
Vue框架下引入ActiveX控件的问题解决
2019/03/25 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
JS如何在不同平台实现多语言方式
2020/07/16 Javascript
浅谈js中的attributes和Attribute的用法与区别
2020/07/16 Javascript
在Python下利用OpenCV来旋转图像的教程
2015/04/16 Python
Python中在脚本中引用其他文件函数的实现方法
2016/06/23 Python
python中退出多层循环的方法
2018/11/27 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
英国计算机产品零售商:Novatech(定制个人电脑、笔记本电脑、工作站和服务器)
2018/01/28 全球购物
阿迪达斯越南官网:adidas越南
2020/07/19 全球购物
师范毕业生个人求职信
2013/12/09 职场文书
球队口号
2014/06/18 职场文书
群众路线教育查摆剖析材料
2014/10/10 职场文书
给领导的感谢信范文
2015/01/23 职场文书
读《人生的智慧》有感:闲暇是人生的精华
2019/12/25 职场文书
Java8 CompletableFuture 异步回调
2022/04/28 Java/Android