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中的生成器和yield详细介绍
Jan 09 Python
Python提取Linux内核源代码的目录结构实现方法
Jun 24 Python
python处理Excel xlrd的简单使用
Sep 12 Python
python3+PyQt5使用数据库窗口视图
Apr 24 Python
Python3随机漫步生成数据并绘制
Aug 27 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
Oct 11 Python
Python-ElasticSearch搜索查询的讲解
Feb 25 Python
python实现布隆过滤器及原理解析
Dec 08 Python
python中数据库like模糊查询方式
Mar 02 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
Jul 09 Python
Pygame游戏开发之太空射击实战敌人精灵篇
Aug 05 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
Apache设置虚拟WEB
2006/10/09 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
利用javascript/jquery对上传文件格式过滤的方法
2009/07/25 Javascript
JavaScript 定义function的三种方式小结
2009/10/16 Javascript
自写简单JS判断是否已经弹出页面
2010/10/20 Javascript
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
2012/02/27 Javascript
js style动态设置table高度
2014/10/21 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
setTimeout内不支持jquery的选择器的解决方案
2015/04/28 Javascript
详解AngularJS中的filter过滤器用法
2016/01/04 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
2017/01/05 Javascript
浅析vue数据绑定
2017/01/17 Javascript
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
微信小程序中使用wxss加载图片并实现动画效果
2018/08/13 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
原生js无缝轮播插件使用详解
2020/03/09 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
AJAX XMLHttpRequest对象创建使用详解
2020/08/20 Javascript
微信小程序实现点击页面出现文字
2020/09/21 Javascript
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
Python中几种操作字符串的方法的介绍
2015/04/09 Python
Python生成器(Generator)详解
2015/04/13 Python
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
python 实现在tkinter中动态显示label图片的方法
2019/06/13 Python
python sorted函数的小练习及解答
2019/09/18 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
2020/01/04 Python
python接入支付宝的实例操作
2020/07/20 Python
python中pyplot基础图标函数整理
2020/11/10 Python
python爬虫beautifulsoup解析html方法
2020/12/07 Python
西安交大自主招生自荐信
2014/01/27 职场文书
最新结婚典礼主持词
2014/03/14 职场文书
大学生违纪检讨书300字
2014/10/25 职场文书
大学生自荐信范文
2015/03/05 职场文书
营销策划分析:怎么策划才能更好销量产品?
2019/09/04 职场文书
nginx从安装到配置详细说明(安装,安全配置,防盗链,动静分离,配置 HTTPS,性能优化)
2022/02/12 Servers
动画「进击的巨人」第86话播出感谢绘公开
2022/03/21 日漫