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实现去除代码前行号的方法
Mar 10 Python
Python实现简单拆分PDF文件的方法
Jul 30 Python
python UNIX_TIMESTAMP时间处理方法分析
Apr 18 Python
Python求出0~100以内的所有素数
Jan 23 Python
python 定时器,轮询定时器的实例
Feb 20 Python
使用python socket分发大文件的实现方法
Jul 08 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
Jul 23 Python
详解Python设计模式之策略模式
Jun 15 Python
Django --Xadmin 判断登录者身份实例
Jul 03 Python
Python爬虫之App爬虫视频下载的实现
Dec 08 Python
教你怎么用Python监控愉客行车程
Apr 29 Python
python tkinter Entry控件的焦点移动操作
May 22 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
第五节 克隆 [5]
2006/10/09 PHP
php a simple smtp class
2007/11/26 PHP
一次因composer错误使用引发的问题与解决
2019/03/06 PHP
《JavaScript高级程序设计》阅读笔记(一) ECMAScript基础
2012/02/27 Javascript
如何制作浮动广告 JavaScript制作浮动广告代码
2012/12/30 Javascript
jquery mobile changepage的三种传参方法介绍
2013/09/13 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
Jquery中扩展方法extend使用技巧
2014/08/24 Javascript
XML文件转化成NSData对象的方法
2015/08/12 Javascript
日常收藏的jquery技巧
2015/12/02 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
基于JavaScript代码实现自动生成表格
2016/06/15 Javascript
JS输出空格的简单实现方法
2016/09/08 Javascript
vue.js+boostrap项目实践(案例详解)
2016/09/21 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
解决vue打包之后静态资源图片失效的问题
2018/02/21 Javascript
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
react 应用多入口配置及实践总结
2018/10/17 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
python实现的正则表达式功能入门教程【经典】
2017/06/05 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
2018/01/16 Python
python2.7+selenium2实现淘宝滑块自动认证功能
2018/02/24 Python
Python动态生成多维数组的方法示例
2018/08/09 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
2020/08/17 Python
python中如何使用虚拟环境
2020/10/14 Python
澳大利亚领先的在线机械五金、园艺和存储专家:Edisons
2018/03/24 全球购物
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
一封普通求职者的求职信
2013/11/20 职场文书
暑期社会实践学生的自我评价
2014/01/09 职场文书
社区安全生产月活动总结
2014/07/05 职场文书
调研座谈会发言材料
2014/08/23 职场文书
办公室主任岗位竞聘书
2015/09/15 职场文书
Java数据结构之堆(优先队列)
2022/05/20 Java/Android