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 GAE、Django导出Excel的方法
Nov 24 Python
简介二分查找算法与相关的Python实现示例
Aug 26 Python
Python语法快速入门指南
Oct 12 Python
Python实现二分查找与bisect模块详解
Jan 13 Python
浅析Git版本控制器使用
Dec 10 Python
使用Python+Splinter自动刷新抢12306火车票
Jan 03 Python
python3 cvs将数据读取为字典的方法
Dec 22 Python
pycharm配置pyqt5-tools开发环境的方法步骤
Feb 11 Python
浅析Python 引号、注释、字符串
Jul 25 Python
Django框架HttpResponse对象用法实例分析
Nov 01 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
Mar 08 Python
Pandas数据分析的一些常用小技巧
Feb 07 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
Uchome1.2 1.5 代码学习 common.php
2009/04/24 PHP
mongodb和php的用法详解
2019/03/25 PHP
JavaScript DOM学习第六章 表单实例
2010/02/19 Javascript
jquery在IE、FF浏览器的差别详细探讨
2013/04/28 Javascript
Jquery.Form 异步提交表单的简单实例
2014/03/03 Javascript
js创建一个input数组并绑定click事件的方法
2014/06/12 Javascript
前端js文件合并的三种方式推荐
2016/05/19 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
js通过classname来获取元素的方法
2016/11/24 Javascript
jQuery中页面返回顶部的方法总结
2016/12/30 Javascript
基于JavaScript实现下拉列表左右移动代码
2017/02/07 Javascript
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
layui使用label标签的方法
2019/09/14 Javascript
[05:02][DOTA2]DOTA进化论 第一期
2013/09/27 DOTA
[14:19]2018年度COSER大赛-完美盛典
2018/12/16 DOTA
python网络爬虫采集联想词示例
2014/02/11 Python
Mac下Supervisor进程监控管理工具的安装与配置
2014/12/16 Python
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
Django实现文件上传下载
2019/10/06 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
2020/04/21 Python
关于tensorflow softmax函数用法解析
2020/06/30 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
2020/11/12 Python
日本整理专家Marie Kondo的官方在线商店:KonMari
2020/06/29 全球购物
软件测试笔试题
2012/10/25 面试题
金融专业大学生自我评价
2014/01/09 职场文书
运动会方阵解说词
2014/02/12 职场文书
大学生自我评价范文分享
2014/02/21 职场文书
表彰大会策划方案
2014/05/13 职场文书
任命书格式
2014/06/05 职场文书
学习十八届四中全会精神思想汇报
2014/10/23 职场文书
德能勤绩廉个人总结
2015/02/14 职场文书
党员干部公开承诺书范文
2015/04/27 职场文书
javaScript Array api梳理
2021/03/31 Javascript
docker compose 部署 golang 的 Athens 私有代理问题
2022/04/28 Servers