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记录运行pid,并在需要时kill掉它们的实例
Jan 16 Python
python编写分类决策树的代码
Dec 21 Python
python中使用%与.format格式化文本方法解析
Dec 27 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
Apr 26 Python
对TensorFlow中的variables_to_restore函数详解
Jul 30 Python
python traceback捕获并打印异常的方法
Aug 31 Python
python 调试冷知识(小结)
Nov 11 Python
python读取yaml文件后修改写入本地实例
Apr 27 Python
python编写实现抽奖器
Sep 10 Python
Pycharm安装第三方库失败解决方案
Nov 17 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
Mar 04 Python
python中数组和列表的简单实例
Mar 25 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中Stream(流)
2015/06/08 PHP
PHP代码优化技巧小结
2015/09/29 PHP
php自定义函数实现二维数组排序功能
2016/07/20 PHP
网上应用的一个不错common.js脚本
2007/08/08 Javascript
使用SyntaxHighlighter实现HTML高亮显示代码的方法
2010/02/04 Javascript
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
js控制table合并具体实现
2014/02/20 Javascript
javascript实现英文首字母大写
2015/04/23 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
2016/01/12 Javascript
分享一个原生的JavaScript拖动方法
2016/09/25 Javascript
bootstrap laydate日期组件使用详解
2017/01/04 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
2017/01/18 Javascript
JS获取子节点、父节点和兄弟节点的方法实例总结
2018/07/06 Javascript
vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例
2019/03/08 Javascript
Vue-cli项目部署到Nginx服务器的方法
2019/11/01 Javascript
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
通过实例解析JavaScript常用排序算法
2020/09/02 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
python下setuptools的安装详解及No module named setuptools的解决方法
2017/07/06 Python
对python append 与浅拷贝的实例讲解
2018/05/04 Python
Python基于Floyd算法求解最短路径距离问题实例详解
2018/05/16 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
对python for 文件指定行读写操作详解
2018/12/29 Python
详解Python 函数如何重载?
2019/04/23 Python
Python3使用TCP编写一个简易的文件下载器功能
2019/05/08 Python
Pycharm添加虚拟解释器报错问题解决方案
2020/10/13 Python
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
时尚设计师手表:The Watch Cabin
2018/10/06 全球购物
网络工程师自荐书范文
2014/04/01 职场文书
党员廉洁自律承诺书
2014/05/26 职场文书
运动员获奖感言
2014/08/15 职场文书
市委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
李强感恩观后感
2015/06/17 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书