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实现的登录和操作开心网脚本分享
Jul 09 Python
Django imgareaselect手动剪切头像实现方法
May 26 Python
Python实现的排列组合计算操作示例
Oct 13 Python
python判断字符串是否是json格式方法分享
Nov 07 Python
Python实现PS滤镜Fish lens图像扭曲效果示例
Jan 29 Python
Python 爬取携程所有机票的实例代码
Jun 11 Python
Python 字符串与数字输出方法
Jul 16 Python
django自带serializers序列化返回指定字段的方法
Aug 21 Python
numpy np.newaxis 的实用分享
Nov 30 Python
将python依赖包打包成window下可执行文件bat方式
Dec 26 Python
通过实例解析python subprocess模块原理及用法
Oct 10 Python
Django正则URL匹配实现流程解析
Nov 13 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和mysql的简单的dao类实现crud操作功能
2014/01/27 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
2015/03/12 PHP
原来Jquery.load的方法可以一直load下去
2011/03/28 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
js日期联动示例
2014/05/02 Javascript
javascript原生和jquery库实现iframe自适应高度和宽度
2014/07/18 Javascript
js使用onmousemove和onmouseout获取鼠标坐标的方法
2015/03/31 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
2016/03/10 Javascript
JS实现的跨浏览器解析XML文件实例
2016/06/21 Javascript
AngularJS 工作原理详解
2016/08/18 Javascript
Bootstrap精简教程中秋大放送
2016/09/15 Javascript
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
2017/03/04 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
2017/05/11 Javascript
详解webpack 多页面/入口支持&amp;公共组件单独打包
2017/06/29 Javascript
微信小程序 循环及嵌套循环的使用总结
2017/09/26 Javascript
微信小程序如何像vue一样在动态绑定类名
2018/04/17 Javascript
js实现动态添加上传文件页面
2018/10/22 Javascript
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
layer实现弹出层自动调节位置
2019/09/05 Javascript
详解jQuery中的prop()使用方法
2020/01/05 jQuery
python操作摄像头截图实现远程监控的例子
2014/03/25 Python
简单说明Python中的装饰器的用法
2015/04/24 Python
Python存取XML的常见方法实例分析
2017/03/21 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
python K近邻算法的kd树实现
2018/09/06 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
2020/02/07 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
Python实现自动签到脚本功能
2020/08/20 Python
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
童装店创业计划书
2014/01/09 职场文书
运动会方阵口号
2014/06/07 职场文书
求职信的正确写法
2014/07/10 职场文书
2015年党支部公开承诺书
2015/01/22 职场文书
2019秋季运动会口号
2019/06/25 职场文书
PHP 时间处理类Carbon
2022/05/20 PHP
MySQL count(*)统计总数问题汇总
2022/09/23 MySQL