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代码来绘制彭罗斯点阵的教程
Apr 03 Python
在Python程序中实现分布式进程的教程
Apr 28 Python
Python实现自动为照片添加日期并分类的方法
Sep 30 Python
Python基于csv模块实现读取与写入csv数据的方法
Jan 18 Python
Python使用cx_Oracle模块操作Oracle数据库详解
May 07 Python
Python动态导入模块的方法实例分析
Jun 28 Python
python 堆和优先队列的使用详解
Mar 05 Python
Django MEDIA的配置及用法详解
Jul 25 Python
python 实现多线程下载视频的代码
Nov 15 Python
Pandas 解决dataframe的一列进行向下顺移问题
Dec 27 Python
python 实现字符串下标的输出功能
Feb 13 Python
keras分类模型中的输入数据与标签的维度实例
Jul 03 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中截取字符串支持utf-8
2007/01/18 PHP
php实现微信公众平台账号自定义菜单类
2014/12/02 PHP
php实现简单的上传进度条
2015/11/17 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
Javascript操纵Cookie实现购物车程序
2006/11/23 Javascript
javascript时区函数介绍
2012/09/14 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
js实现简单折叠、展开菜单的方法
2015/08/28 Javascript
用canvas 实现个图片三角化(LOW POLY)效果
2016/02/18 Javascript
Angular 中 select指令用法详解
2016/09/29 Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
2016/11/29 Javascript
js使用原型对象(prototype)需要注意的地方
2017/08/28 Javascript
JavaScript实现短暂提示框功能
2018/04/04 Javascript
微信小程序自定义多选事件的实现代码
2018/05/17 Javascript
JavaScript中创建原子的方法总结
2018/08/26 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
JS异步宏队列与微队列原理区别详解
2020/07/02 Javascript
Python计算程序运行时间的方法
2014/12/13 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
2016/06/07 Python
python自定义异常实例详解
2017/07/11 Python
解决Django加载静态资源失败的问题
2019/07/28 Python
python 实现按对象传值
2019/12/26 Python
CSS3实现多背景展示效果通过CSS3定位多张背景
2014/08/10 HTML / CSS
CSS3中的常用选择器使用示例整理
2016/06/13 HTML / CSS
日本化妆品植村秀俄罗斯官方网站:Shu Uemura俄罗斯
2020/02/01 全球购物
会计专业毕业生自我评价
2013/09/25 职场文书
大班亲子运动会方案
2014/06/10 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
高一军训决心书
2015/02/05 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
个人催款函范文
2015/06/23 职场文书
springboot用户数据修改的详细实现
2022/04/06 Java/Android