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实现的彩票机选器实例
Jun 17 Python
在DigitalOcean的服务器上部署flaskblog应用
Dec 19 Python
python文件的md5加密方法
Apr 06 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
Feb 21 Python
Python实现二维曲线拟合的方法
Dec 29 Python
Django框架用户注销功能实现方法分析
May 28 Python
python解析命令行参数的三种方法详解
Nov 29 Python
python获取百度热榜链接的实例方法
Aug 25 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
Sep 24 Python
在pycharm创建scrapy项目的实现步骤
Dec 01 Python
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
Apr 12 Python
python 如何做一个识别率百分百的OCR
May 29 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
自动分页的不完整解决方案
2007/01/12 PHP
php下使用curl模拟用户登陆的代码
2010/09/10 PHP
php 大数据量及海量数据处理算法总结
2011/05/07 PHP
php json_encode奇怪问题说明
2011/09/27 PHP
Laravel5.1自定义500错误页面示例
2016/10/09 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
PHP二维数组分页2种实现方法解析
2020/07/09 PHP
Hutia 的 JS 代码集
2006/10/24 Javascript
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
ExtJs Excel导出并下载IIS服务器端遇到的问题
2011/09/16 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
JavaScript父子窗体间的调用方法
2015/03/31 Javascript
JavaScript实现给按钮加上双重动作的方法
2015/08/14 Javascript
原生JS实现仿淘宝网左侧商品分类菜单效果代码
2015/09/10 Javascript
实例详解angularjs和ajax的结合使用
2015/10/22 Javascript
js实现iframe框架取值的方法(兼容IE,firefox,chrome等)
2015/11/26 Javascript
bootstrap jquery dataTable 异步ajax刷新表格数据的实现方法
2017/02/10 Javascript
canvas绘制爱心的几种方法总结(推荐)
2017/10/31 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
JavaScript canvas实现雨滴特效
2021/01/10 Javascript
[01:15:45]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第一局
2016/02/26 DOTA
Python 元类使用说明
2009/12/18 Python
Python爬虫代理IP池实现方法
2017/01/05 Python
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
2019/08/15 Python
Volcom法国官网:美国冲浪滑板品牌
2017/05/25 全球购物
标签和贴纸印刷:Lightning Labels
2018/03/22 全球购物
生产部管理制度
2014/01/31 职场文书
三分钟演讲稿事例
2014/03/03 职场文书
实习证明格式范文
2014/10/14 职场文书
综合实践活动报告
2015/02/05 职场文书
民事诉讼代理词
2015/05/25 职场文书
欠条格式范本
2015/07/03 职场文书
校园安全学习心得体会
2016/01/18 职场文书
Nebula Graph解决风控业务实践
2022/03/31 MySQL