Django CSRF跨站请求伪造防护过程解析


Posted in Python onJuly 31, 2019

前言

CSRF全称Cross-site request forgery(跨站请求伪造),是一种网络的攻击方式,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF。

攻击原理

1、用户访问正常的网站A,浏览器就会保存网站A的cookies。

2、用户在访问恶意网站B, 网站B上有某个隐藏的链接会自动请求网站A的链接地址,例如表单提交,传指定的参数。

3、恶意网站B的自动化请求,执行就是在用户A的同一个浏览器上,因此在访问网站A的时候,浏览器会自动带上网站A的cookies。

4、所以网站A在接收到请求之后,可判断当前用户登录状态,所以根据用户的权限做具体的操作逻辑。

防范措施

1、在指定表单或者请求头的里面添加一个随机值做为参数。

2、在响应的cookie里面也设置该随机值。

3、用户正常提交表单的时候会默认带上表单中的随机值,浏览器会自动带上cookie里面的随机值,那么服务器下次接受到请求之后就可以取出两个值进行校验。

4、对于网站B来说网站B在提交表单的时候不知道该随机值是什么,所以就形成不了攻击。

Django中CSRF中间件

django在创建项目的时候,默认就会有添加中间进行CSRF的保护,在MIDDLEWARE可以看到加载了 django.middleware.csrf.CsrfViewMiddleware 的中间件,这里是全局设置,也可以局部设置。

全局保护:直接启用中间件就可以了。

局部保护: from django.views.decorators.csrf import csrf_exempt,csrf_protect ,使用装饰器进行验证。

csrf_protect :为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件;

csrf_exempt :取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

验证

在POST请求提交数据的时候,django会去检查是否有一个csrf的随机字符串,如果没有就会返回403没有权限访问。

表单验证

在form表单里面需要添加{%csrf_token%},Django会自动渲染隐藏的input输入框:

<input type="hidden" name="csrfmiddlewaretoken" value="2Sb0DQwDVgOQ8i3n1BaG1MUPLEYr6ZGaCLYa14maOQM0Ami5ddQOR6hfXuD2mrmA">

在表单提交的时候,中间件会验证csrfmiddlewaretoken。

通过ajax提交

通过cookies获取到csrftoken,

function getCookie(name) {
  var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
  return r ? r[1] : undefined;
}
$.ajax({
  url:"/api/v1.0/orders",
  type:"POST",
  data: JSON.stringify(data),
  contentType: "application/json",
  dataType: "json",
  headers:{
    "X-CSRFtoken":getCookie("csrf_token"),
  },

局部禁用或者启用

1、如果是函数视图,可以直接在函数加上装饰器即可:

from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_exempt
def login(request):
  if request.method == 'GET':
    return render(request,'login.html')
  else:
    return HttpResponse('ok')

2、如果是类视图,需要使用方法装饰器进行封装

from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django.views.generic import TemplateView

@method_decorator(csrf_exempt)
class LoginView(TemplateView):
  template_name = 'login.html'
  def post():
    return HttpResponse('ok')

3、直接装饰as_view()方式,在URLconf里面设置。

from django.views.decorators.csrf import csrf_exempt,csrf_protect
urlpatterns = [
  path('login/', csrf_exempt(LoginView.as_view()),name="login"),
]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python数据结构之Array用法实例
Oct 09 Python
python并发编程之线程实例解析
Dec 27 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
May 30 Python
Python使用try except处理程序异常的三种常用方法分析
Sep 05 Python
python对html过滤处理的方法
Oct 21 Python
用Python写一个模拟qq聊天小程序的代码实例
Mar 06 Python
很酷的python表白工具 你喜欢我吗
Apr 11 Python
python 如何将数据写入本地txt文本文件的实现方法
Sep 11 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
Sep 23 Python
Tensorflow中的降维函数tf.reduce_*使用总结
Apr 20 Python
Python垃圾回收机制三种实现方法
Apr 27 Python
keras实现多GPU或指定GPU的使用介绍
Jun 17 Python
在VS2017中用C#调用python脚本的实现
Jul 31 #Python
使用pip安装python库的多种方式
Jul 31 #Python
python实现几种归一化方法(Normalization Method)
Jul 31 #Python
python Django编写接口并用Jmeter测试的方法
Jul 31 #Python
python实现windows倒计时锁屏功能
Jul 30 #Python
python创建属于自己的单词词库 便于背单词
Jul 30 #Python
python中append实例用法总结
Jul 30 #Python
You might like
php imagecreatetruecolor 创建高清和透明图片代码小结
2010/05/15 PHP
php设计模式 Template (模板模式)
2011/06/26 PHP
fgetcvs在linux的问题
2012/01/15 PHP
微信获取用户地理位置信息的原理与步骤
2015/11/12 PHP
利用javascript查看html源文件
2006/11/08 Javascript
url 特殊字符 传递参数解决方法
2010/01/01 Javascript
禁止你的左键复制实用技巧
2013/01/04 Javascript
jQuery根据纬度经度查看地图处理程序
2013/05/08 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
浅谈Javascript数据属性与访问器属性
2016/07/26 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
Express下采用bcryptjs进行密码加密的方法
2018/02/07 Javascript
基于vue.js实现分页查询功能
2018/12/29 Javascript
js实现的格式化数字和金额功能简单示例
2019/07/30 Javascript
package.json配置文件构成详解
2019/08/27 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
前端 javascript 实现文件下载的示例
2020/11/24 Javascript
[05:22]DOTA2 2015国际邀请赛中国区预选赛首日TOP10
2015/05/26 DOTA
Python3.x对JSON的一些操作示例
2017/09/01 Python
对python 多线程中的守护线程与join的用法详解
2019/02/18 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
2019/04/11 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
Falsk 与 Django 过滤器的使用与区别详解
2019/06/04 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
Coach澳大利亚官方网站:美国著名时尚奢侈品牌
2017/05/24 全球购物
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
物理教育专业毕业生推荐信
2013/11/03 职场文书
绝对经典成功的大学生推荐信
2013/11/08 职场文书
会计与出纳自荐书范文
2014/03/16 职场文书
岗位职责说明书模板
2014/07/30 职场文书
12.4全国法制宣传日活动方案
2014/11/02 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
2015年八一建军节慰问信
2015/03/23 职场文书
入党积极分子党支部意见
2015/06/02 职场文书
《月球之谜》教学反思
2016/02/20 职场文书
Matplotlib绘制混淆矩阵的实现
2021/05/27 Python