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中DataFrame按照行遍历的方法
Apr 08 Python
Anaconda下安装mysql-python的包实例
Jun 11 Python
使用python读取csv文件快速插入数据库的实例
Jun 21 Python
python+opencv实现霍夫变换检测直线
Oct 23 Python
python基于socket进行端口转发实现后门隐藏的示例
Jul 25 Python
python中hasattr()、getattr()、setattr()函数的使用
Aug 16 Python
Django实现网页分页功能
Oct 31 Python
Python字符编码转码之GBK,UTF8互转
Feb 09 Python
Python读入mnist二进制图像文件并显示实例
Apr 24 Python
python IDLE添加行号显示教程
Apr 25 Python
python反扒机制的5种解决方法
Feb 06 Python
浅谈Python数学建模之固定费用问题
Jun 23 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编码规范-php coding standard
2007/03/16 PHP
2个Codeigniter文件批量上传控制器写法例子
2014/07/25 PHP
Javascript 验证上传图片大小[客户端]
2009/08/01 Javascript
JavaScript 弹出窗体点击按钮返回选择数据的实现
2010/04/01 Javascript
Web前端设计模式  制作漂亮的弹出层
2010/10/29 Javascript
jQuery中[attribute!=value]选择器用法实例
2014/12/31 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
2015/01/13 Javascript
谈一谈jQuery核心架构设计
2016/03/28 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
2016/07/27 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
2016/10/10 Javascript
ES6新数据结构Set与WeakSet用法分析
2017/03/31 Javascript
angular $watch 一个变量的变化(实例讲解)
2017/08/02 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
通过javascript实现段落的收缩与展开
2019/06/26 Javascript
ajax jquery实现页面某一个div的刷新效果
2021/03/04 jQuery
Python使用Pickle库实现读写序列操作示例
2018/06/15 Python
Python os.access()用法实例
2019/02/18 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
2020/01/04 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
2020/02/27 Python
keras中的卷积层&amp;池化层的用法
2020/05/22 Python
python中常见错误及解决方法
2020/06/21 Python
python爬虫多次请求超时的几种重试方法(6种)
2020/12/01 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
美国咖啡批发网站:Coffee.org
2017/06/29 全球购物
Python面试题:Python是如何进行内存管理的
2014/08/04 面试题
合作经营协议书范本
2014/09/16 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
《倍数和因数》教学反思
2016/02/23 职场文书
Django debug为True时,css加载失败的解决方案
2021/04/24 Python
python基础学习之递归函数知识总结
2021/05/26 Python
MySQL分区表管理命令汇总
2022/03/21 MySQL
Python采集壁纸并实现炫轮播
2022/04/30 Python