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 相关文章推荐
探索Python3.4中新引入的asyncio模块
Apr 08 Python
Python实现LRU算法的2种方法
Jun 24 Python
numpy返回array中元素的index方法
Jun 27 Python
用Python实现筛选文件脚本的方法
Oct 27 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
Jun 18 Python
如何基于python生成list的所有的子集
Nov 11 Python
tensorflow 获取checkpoint中的变量列表实例
Feb 11 Python
Python代码注释规范代码实例解析
Aug 14 Python
Python离线安装openpyxl模块的步骤
Mar 30 Python
pytorch 实现多个Dataloader同时训练
May 29 Python
如何利用pygame实现打飞机小游戏
May 30 Python
通过Python把学姐照片做成拼图游戏
Feb 15 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 Sql Server连接失败问题及解决办法
2009/08/07 PHP
php批量删除cookie的简单实现方法
2015/01/26 PHP
简单谈谈PHP中strlen 函数
2016/02/27 PHP
实现PHP搜索加分页
2016/10/12 PHP
PHP执行linux命令6个函数代码实例
2020/11/24 PHP
javascript运行机制之this详细介绍
2014/02/07 Javascript
javascript Array 数组常用方法
2015/04/05 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
2016/07/01 Javascript
jQuery子元素过滤选择器用法示例
2016/09/09 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
2017/01/21 Javascript
vue 使用自定义指令实现表单校验的方法
2018/08/28 Javascript
解决angularJS中input标签的ng-change事件无效问题
2018/09/13 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
在vue项目实现一个ctrl+f的搜索功能
2020/02/28 Javascript
Vue脚手架编写试卷页面功能
2020/03/17 Javascript
js实现带箭头的进度流程
2020/03/26 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
2020/04/08 Javascript
vue 通过base64实现图片下载功能
2020/12/19 Vue.js
python获取本机mac地址和ip地址的方法
2015/04/29 Python
windows下python和pip安装教程
2018/05/25 Python
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
JavaScript中的模拟事件和自定义事件实例分析
2018/07/27 Python
python中文编码与json中文输出问题详解
2018/08/24 Python
python多线程同步之文件读写控制
2021/02/25 Python
Python搭建代理IP池实现检测IP的方法
2019/10/27 Python
python 通过视频url获取视频的宽高方式
2019/12/10 Python
Python configparser模块常用方法解析
2020/05/22 Python
分享一个python的aes加密代码
2020/12/22 Python
利用CSS3实现的文字定时向上滚动
2016/08/29 HTML / CSS
H&M美国官网:欧洲最大的服饰零售商
2016/09/07 全球购物
德国大型的家具商店:Pharao24.de
2016/10/02 全球购物
静态变量和实例变量的区别
2015/07/07 面试题
连带责任保证书
2014/04/29 职场文书
公司承诺书格式
2014/05/21 职场文书
个人查摆剖析材料
2014/10/16 职场文书
2015年清明节扫墓演讲稿
2015/03/18 职场文书