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实现正则匹配检索远端FTP目录下的文件
Mar 25 Python
在Django的URLconf中使用多个视图前缀的方法
Jul 18 Python
Python中input与raw_input 之间的比较
Aug 20 Python
基于python元祖与字典与集合的粗浅认识
Aug 23 Python
python脚本监控Tomcat服务器的方法
Jul 06 Python
Python使用type关键字创建类步骤详解
Jul 23 Python
python如何将两个txt文件内容合并
Oct 18 Python
Python网络编程之使用TCP方式传输文件操作示例
Nov 01 Python
Python实现括号匹配方法详解
Feb 10 Python
Pycharm 跳转回之前所在页面的操作
Feb 05 Python
pandas中对文本类型数据的处理小结
Nov 01 Python
python高温预警数据获取实例
Jul 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
弄了个检测传输的参数是否为数字的Function
2006/12/06 PHP
不错的PHP学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
详细解读PHP中接口的应用
2015/08/12 PHP
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
JavaScript运行时库属性一览表
2014/03/14 Javascript
jQuery操作DOM之获取表单控件的值
2015/01/23 Javascript
js实现带缓冲效果的仿QQ面板折叠菜单代码
2015/09/06 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
2017/01/01 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
2017/04/13 jQuery
jquery仿京东商品放大浏览页面
2017/06/06 jQuery
深入理解Vuex 模块化(module)
2017/09/26 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
2017/10/27 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
vue 路由懒加载中给 Webpack Chunks 命名的方法
2020/04/24 Javascript
Python制作词云的方法
2018/01/03 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
2019/02/01 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
Html5 APP中监听返回事件处理的方法示例
2018/03/15 HTML / CSS
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
为什么需要版本控制
2016/10/28 面试题
进修护士自我鉴定
2013/10/14 职场文书
室内设计专业个人的自我评价
2013/10/19 职场文书
商务邀请函范文
2014/01/14 职场文书
成品库仓管员岗位职责
2014/04/06 职场文书
爱国演讲稿400字
2014/05/07 职场文书
2014年秋季开学演讲稿
2014/05/24 职场文书
小学少先队辅导员述职报告
2015/01/10 职场文书
学雷锋日活动总结
2015/02/06 职场文书
学生保证书格式
2015/02/27 职场文书
廉洁自律承诺书范文
2015/04/28 职场文书