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实现人机对话
Nov 14 Python
Python爬虫文件下载图文教程
Dec 23 Python
python requests post多层字典的方法
Dec 27 Python
使用k8s部署Django项目的方法步骤
Jan 14 Python
Python实现操纵控制windows注册表的方法分析
May 24 Python
使用WingPro 7 设置Python路径的方法
Jul 24 Python
python框架django项目部署相关知识详解
Nov 04 Python
使用apiDoc实现python接口文档编写
Nov 19 Python
Python Selenium安装及环境配置的实现
Mar 17 Python
python3+openCV 获取图片中文本区域的最小外接矩形实例
Jun 02 Python
pandas使用函数批量处理数据(map、apply、applymap)
Nov 27 Python
Python作用域和名称空间的详细介绍
Apr 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基础学习笔记
2007/03/18 PHP
Session保存到数据库的php类分享
2011/10/24 PHP
php数组函数序列之sort() 对数组的元素值进行升序排序
2011/11/02 PHP
zend framework文件上传功能实例代码
2013/12/25 PHP
Codeigniter实现多文件上传并创建多个缩略图
2014/06/12 PHP
thinkPHP5实现的查询数据库并返回json数据实例
2017/10/23 PHP
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
2013/04/15 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
JavaScript代码复用模式详解
2014/11/07 Javascript
浅析javascript中函数声明和函数表达式的区别
2015/02/15 Javascript
JS实现跟随鼠标闪烁转动色块的方法
2015/02/26 Javascript
简单实现兼容各大浏览器的js复制内容到剪切板
2015/09/09 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
2016/01/17 Javascript
浅析JavaScript作用域链、执行上下文与闭包
2016/02/01 Javascript
关于JS中二维数组的声明方法
2016/09/24 Javascript
详解JavaScript数组过滤相同元素的5种方法
2017/05/23 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
2019/04/07 Javascript
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
2019/06/27 Javascript
javascript中的闭包概念与用法实践分析
2019/07/26 Javascript
JS实现水平遍历和嵌套递归操作示例
2019/08/15 Javascript
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
python基于xml parse实现解析cdatasection数据
2014/09/30 Python
python中使用 xlwt 操作excel的常见方法与问题
2019/01/13 Python
利用pyuic5将ui文件转换为py文件的方法
2019/06/19 Python
wxpython绘制圆角窗体
2019/11/18 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
2020/03/09 Python
html5写一个BUI折叠菜单插件的实现方法
2019/09/11 HTML / CSS
中邮全球便购:中国邮政速递物流
2017/03/04 全球购物
日语专业毕业生自荐信
2013/11/11 职场文书
任命书模板
2014/06/04 职场文书
无子女夫妻离婚协议书(4篇)
2014/10/20 职场文书
政审证明材料
2015/06/19 职场文书
纪检监察立案决定书
2015/06/24 职场文书
【超详细】八大排序算法的各项比较以及各自特点
2021/03/31 Python
Mysql - 常用函数 每天积极向上
2021/04/05 MySQL