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 相关文章推荐
对pandas处理json数据的方法详解
Feb 08 Python
详解Python Qt的窗体开发的基本操作
Jul 14 Python
Python PO设计模式的具体使用
Aug 16 Python
Python爬虫使用代理IP的实现
Oct 27 Python
python使用 cx_Oracle 模块进行查询操作示例
Nov 28 Python
python numpy数组中的复制知识解析
Feb 03 Python
python如何通过闭包实现计算器的功能
Feb 22 Python
详解用Python调用百度地图正/逆地理编码API
Jul 02 Python
Django后端分离 使用element-ui文件上传方式
Jul 12 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
Jul 13 Python
Python tkinter之ComboBox(下拉框)的使用简介
Feb 05 Python
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
May 24 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
PhpMyAdmin中无法导入sql文件的解决办法
2010/01/08 PHP
PHP合并数组+与array_merge的区别分析
2010/08/01 PHP
php文件缓存类用法实例分析
2015/04/22 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
实现PHP中session存储及删除变量
2018/10/15 PHP
拖动一个HTML元素
2006/12/22 Javascript
JavaScript版DateAdd和DateDiff函数代码
2012/03/01 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
jQuery过滤选择器:not()方法使用介绍
2014/04/20 Javascript
node.js中的fs.readdir方法使用说明
2014/12/17 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
学习jQuey中的return false
2015/12/18 Javascript
移动端翻页插件dropload.js(支持Zepto和jQuery)
2016/07/27 Javascript
JavaScript实现三级联动效果
2017/07/15 Javascript
Vue 表单控件绑定的实现示例
2017/08/11 Javascript
微信小程序实现鼠标拖动效果示例
2017/12/01 Javascript
vue-cli 引入、配置axios的方法
2018/05/08 Javascript
浅谈js闭包理解
2019/04/01 Javascript
详解ES6 CLASS在微信小程序中的应用实例
2020/04/24 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
[09:37]DOTA2卡尔工作室 英雄介绍圣堂刺客篇
2013/06/13 DOTA
[28:42]Ti4正赛VG vs NEWBEE1
2014/07/19 DOTA
[01:45]DOTA2众星出演!DSPL刀塔次级职业联赛宣传片
2014/11/21 DOTA
python分析apache访问日志脚本分享
2015/02/26 Python
python入门教程 python入门神图一张
2018/03/05 Python
python使用sqlite3时游标使用方法
2018/03/13 Python
在python中pandas的series合并方法
2018/11/12 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
德国2018年度最佳在线药房:Bodfeld Apotheke
2019/11/04 全球购物
致跳远、跳高运动员广播稿
2014/01/09 职场文书
商铺租房协议书范本
2014/12/04 职场文书
红歌会主持词
2015/07/02 职场文书
小学远程教育工作总结
2015/08/13 职场文书
SpringBoot工程下使用OpenFeign的坑及解决
2021/07/02 Java/Android
python高温预警数据获取实例
2022/07/23 Python