Django中间件与csrf

一. django中间件

1. 什么是django中间件

# django中间件是django的门户1. 请求来的时候需要先经过中间件才能到达真正的django后端2. 响应走的时候最后也需要经过中间件才能发送出去

2. django中间件的个数

django自带七个中间件, 分别是SecurityMiddleware, SessionMiddleware,CommonMiddleware, CsrfViewMiddleware, AuthenticationMiddleware,MessageMiddleware, XFrameOptionMiddleware

3. django请求生命周期流程图

 

4. 研究django中间件代码规律

# settings.py配置文件中
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',]class SessionMiddleware(MiddlewareMixin):def process_request(self, request):...def process_response(self, request, response):...class CsrfViewMiddleware(MiddlewareMixin):def process_request(self, request):...def process_view(self, request, callback, callback_args, callback_kwargs):...def process_response(self, request, response):...class AuthenticationMiddleware(MiddlewareMixin):def process_request(self, request):...   

5. 自定义中间件

# django支持程序员自定义中间件, 并且暴露给程序员五个可以自定义的方法# 掌握process_requestprocess_response# 了解process_viewprocess_template_responseprocess_exception

5-1. 自定义中间件流程
1. 在项目名或者应用名下创建一个任意名称的文件夹
2. 在该文件夹内创建一个任意名称的py文件
3. 在该py文件内需要书写类(注意: 这个类必须继承MiddlewareMixin)然后在这个类里面就可以自定义五个方法了提示: 这五个方法并不是全部都需要书写,用几个写几个
4. 需要将类的路径以字符串的形式注册到settings.py配置文件中的MIDDLEWARE下才能生效
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',# 注册自己的中间件(在应用下创建路径有提示,但是如果在项目下创建就没有提示了 你就需要自己比对着书写)'你自己写的中间件的路径1','你自己写的中间件的路径2','你自己写的中间件的路径3',
]

5-2. 二种掌握自定义: process_request, process_response
'''
process_request1. 请求来的时候会依此走 MIDDLEWARE 中定义的该方法. 如果没有定义就跳过.执行顺序:  MIDDLEWARE 中从上到下2. 如果返回 HttpResponse 对象, 请求将不会继续往后执行, 而是原路返回目的: 用来做全局相关的所有限制功能应用: 校验失败不允许访问process_response1. 响应走的时候会依此走 MIDDLEWARE 中定义的该方法. 如果没有定义就跳过.执行顺序:  MIDDLEWARE 中从下到上2. 该方法必须返回  HttpResponse 对象2.1 默认返回形参response2.2 返回自定义的拓展: 综合2者: 如果 process_request 方法指定返回 HttpResponse对象.1. 后续 process_request 方法不执行.2. 从同级别 process_response 方法开始按照 MIDDLEWARE 从下到上依此返回.3. 如果 process_response 方法没有指定自定义返回结果, 默认返回的就是 process_request 中返回的结果. 否则返回 process_response 方法的结果拓展: flask框架也有一个中间件但是它的规律只要返回数据了就必须经过所有中间件里面的类似process_reponse方法     
'''
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponseclass FirstMiddleware(MiddlewareMixin):def process_request(self, request):"""1. 请求来的时候需要经过每一个中间件里面的process_request方法结果的顺序是按照配置文件中注册的中间件从上往下的顺序依次执行2. 如果中间件里面没有定义该方法,那么直接跳过执行下一个中间件3 .如果该方法返回了HttpResponse对象,那么请求将不再继续往后执行而是直接原路返回(校验失败不允许访问...)process_request方法就是用来做全局相关的所有限制功能"""print('我是 FirstMiddleware 类中的定义的 process_request 方法')def process_response(self, request, response):"""1.响应走的时候需要结果每一个中间件里面的process_response方法该方法有两个额外的参数request,response2. 该方法必须返回一个HttpResponse对象. 不返回抛出异常: 'NoneType' object has no attribute 'get'2-1. 默认返回的就是形参response2-2. 你也可以自己返回自己的3. 顺序是按照配置文件中注册了的中间件从下往上依次经过如果你没有定义的话 直接跳过执行下一个:param response: 就是django后端返回给浏览器的内容"""print('我是 FirstMiddleware 类中的定义的 process_response 方法')return responseclass SecondMiddleware(MiddlewareMixin):def process_request(self, request):print('我是 SecondMiddleware 类中的定义的 process_request 方法')# return HttpResponse(#     '研究2: 如果 process_request 方法返回了 HttpResponse 对象,那么请求将不再继续往后执行而是直接原路返回. 响应走的时候是经过同级别的 process_response 返回')def process_response(self, request, response):print('我是 SecondMiddleware 类中的定义的 process_response 方法')# return HttpResponse('研究1: 如果 process_response 方法返回了 HttpResponse 对象,那么响应按照自己的返回结果作为标准返回.')return response

5-3. 三种了解自定义: process_view, process_template_response, process_exception
'''
process_view路由匹配之前 或者 执行视图函数之前 时触发执行顺序: MIDDLEWARE 中从上到下
process_template_response视图函数返回结果中含有render属性是触发执行顺序: MIDDLEWARE 中从下到上
process_exception视图函数出现异常时触发执行顺序: MIDDLEWARE 中从下到上
'''
from django.utils.deprecation import MiddlewareMixinclass FirstMiddleware(MiddlewareMixin):def process_view(self, request, view_name, *args, **kwargs):"""路由匹配成功之后执行视图函数之前,会自动执行中间件里面的该放法顺序是按照配置文件中注册的中间件从上往下的顺序依次执行"""print(view_name, args, kwargs)    # <function my_index at 0x000002345C28BEA0> ((), {}) {}print('我是第一个自定义中间件里面的 process_view')def process_template_response(self, request, response):"""返回的HttpResponse对象有render属性的时候才会触发顺序是按照配置文件中注册了的中间件从下往上依次经过def index(request):print('我是视图函数index')obj = HttpResponse('index')def render():print('内部的render')return HttpResponse("O98K")obj.render = renderreturn obj"""print('我是第一个自定义中间件里面的 process_template_response')return responsedef process_exception(self, request, exception):"""当视图函数中出现异常的情况下触发顺序是按照配置文件中注册了的中间件从下往上依次经过"""print('我是第一个中间件里面的 process_exception')print(exception)class SecondMiddleware(MiddlewareMixin):def process_view(self, request, view_name, *args, **kwargs):print(view_name, args, kwargs)print('我是第二个自定义中间件里面的 process_view')def process_template_response(self, request, response):print('我是第二个自定义中间件里面的 process_template_response')return responsedef process_exception(self, request, exception):print('我是第二个中间件里面的process_exception')print(exception)

二. csrf跨站请求伪造

1. csrf介绍

# csrf 全称 cross site request forgery 跨站请求伪造# 举一个实例来描述什么是csrf:我搭建一个跟正规网站一模一样的界面(中国银行)用户不小心进入到了我们的网站,用户给某个人打钱打钱的操作确确实实是提交给了中国银行的系统,用户的钱也确确实实减少了但是唯一不同的时候打钱的账户不适用户想要打的账户变成了一个莫名其妙的账户# 内部本质我们在钓鱼网站的页面 针对对方账户 只给用户提供一个没有name属性的普通input框然后我们在内部隐藏一个已经写好name和value的input框# 如何规避上述问题: csrf跨站请求伪造校验网站在给用户返回一个具有提交数据功能页面的时候会给这个页面加一个唯一标识, 斌且这个唯一标识永远不一样当这个页面朝后端发送post请求的时候 我的后端会先校验唯一标识,如果唯一标识不对直接拒绝(403 forbbiden)如果成功则正常执行

2. CSRF跨站请求伪造及解决思路流程图

 

3. 针对form与ajax的符合校验设置来解决CSRF问题

# form表单符合校验: 只需要指定一个 {% load csrf_token %} 即可<head>{% load static %} {# 方式三 #}<script src="{% static 'js/pass_csrf.js' %}"></script></head><body><h3>我是正规网站</h3><form action="" method="post">{% csrf_token %}<p>转账账户: <input type="text" name="user"></p><p>目标账户: <input type="text" name="target_user"></p><p>转账金额: <input type="text" name="money"></p><input type="submit" value="form表单提交"></form><br># ajax符合校验设置
'''
方式一: 利用标签查找获取页面上的随机字符串'csrfmiddlewaretoken': $("[name='csrfmiddlewaretoken']").val()
方式二:  利用模版语法提供的快捷书写'csrfmiddlewaretoken': '{{ csrf_token }}'注意: 这里是 '{{ csrf_token }}' 而不是 {% csrf_token %}
方式三: 通用直接拷贝js代码并应用到自己的html页面上即可{% load static %}<script src="{% static 'js/pass_csrf.js' %}"></script>
'''
<button id="d1">ajax方式提交</button>
<script>$('#d1').on('click', function () {$.ajax({url: '',type: 'post',data: {'user': 'jason',{#'user': $("[name='user']").val(),#}{#'target_user': $("[name='target_user']").val(),#}'target_user': 'egon',{#'money': $("[name='money']").val(),#}'money': '100000',{#'csrfmiddlewaretoken': $("[name='csrfmiddlewaretoken']").val(),#}      // 方式一{#'csrfmiddlewaretoken': '{{ csrf_token }}',#}  // 方式二},success: function () {},})})
</script>

ajax符合校验设置第三种方法的js代码拷贝
function getCookie(name) {var cookieValue = null;if (document.cookie && document.cookie !== '') {var cookies = document.cookie.split(';');for (var i = 0; i < cookies.length; i++) {var cookie = jQuery.trim(cookies[i]);// Does this cookie string begin with the name we want?if (cookie.substring(0, name.length + 1) === (name + '=')) {cookieValue = decodeURIComponent(cookie.substring(name.length + 1));break;}}}return cookieValue;
}
var csrftoken = getCookie('csrftoken');function csrfSafeMethod(method) {// these HTTP methods do not require CSRF protectionreturn (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}$.ajaxSetup({beforeSend: function (xhr, settings) {if (!csrfSafeMethod(settings.type) && !this.crossDomain) {xhr.setRequestHeader("X-CSRFToken", csrftoken);}}
});

4. {% csrf_token%} 与 {{ csrf_token }}的表现形式及两者之间的关系

# {% csrf_token%}<input type="hidden" name="csrfmiddlewaretoken" value="Fuih8hBFfSw7usOBVz1FF8yWYlBVeqmJ59O0HGGZp9Rko4Ovm9F5QnS2Zm0dKV5K"># {{ csrf_token }}# 对应的就是{% csrf_token %}input标签中的value值BTYOUHdtrTRzOKnSFn1yzu4hnbs2J88h1yuxt6iNBacMImnM6XFYKJonocRkfDRi

三. csrf相关装饰器

# 需求
'''
1. 网站整体都不校验csrf,就单单几个视图函数需要校验
2. 网站整体都校验csrf,就单单几个视图函数不校验
'''

1. 针对FBV

from django.views.decorators.csrf import csrf_protect, csrf_exempt# @csrf_exempt
# @csrf_protect
def my_transfer(request):if request.method == "POST":user = request.POST.get('user')target_user = request.POST.get('target_user')money = request.POST.get('money')print(f'{user}给{target_user}转了{money}元')return render(request, 'my_transfer.html')

2. 争对CBV

"""
csrf_protect  需要校验针对csrf_protect符合装饰器的三种玩法
csrf_exempt   忽视校验针对csrf_exempt只能给dispatch方法加才有效
"""
from django.views.decorators.csrf import csrf_protect, csrf_exempt
from django.utils.decorators import method_decorators# @method_decorator(csrf_protect, name='post')
class MySelfCsrfToken(View):# @method_decorator(csrf_protect)def dispatch(self, request, *args, **kwargs):return super(MySelfCsrfToken, self).dispatch(request, *args, **kwargs)def get(self, request):return HttpResponse('get 请求')# @method_decorator(csrf_protect)def post(self, request):return HttpResponse('post 请求')# @method_decorator(csrf_exempt, name='post')
class MySelfCsrfToken(View):@method_decorator(csrf_exempt)def dispatch(self, request, *args, **kwargs):return super(MySelfCsrfToken, self).dispatch(request, *args, **kwargs)def get(self, request):return HttpResponse('get 请求')# @method_decorator(csrf_exempt)def post(self, request):return HttpResponse('post 请求')

四. 总结

# django中间件# 什么是django中间件: 它是django的大门请求来的时候要先过中间件才能到达真正的django后端响应走的时候也需要经过中间件才能发送出去# django中间件个数: 自带七个SecurityMiddlewareSessionMiddlewareCommonMiddlewareCsrfViewMiddlewareAuthenticationMiddlewareMessageMiddlewareXFrameOptionMiddleware# django提供了5种自定义中间件方法process_requestprocess_responseprocess_viewprocess_template_responseprocess_exception# 自定义中间件流程1. 应用 或 项目 下创建任意文件夹2. 在创建的任意文件夹下创建任意的.py文件3. 在创建的任意的.py文件中书写类. 该类要继承MiddlewareMixin4. 到settings.py配置文件中找到MIDDLEWARE注册# 二种掌握自定义: process_request, process_response# process_request1. 请求来的时候会从上到下依此执行注册了中间件类中的方法. 没有定义就跳过2. 如果返回了HttpResponse对象, 请求将不会往下执行, 而是原路返回功能: 用来做全局相关的所有限制功能应用: 效验用户权限功能# process_response1. 响应走的时候会从下到上依此执行注册了中间件类中的方法. 没有定义就跳过2. 该方法必须返回HttpResponse对象2-1. 返回参数response2-2. 返回自定义HttpResponse对象# 二者综合:如果process_request方法返回的是HttpResponse对象. 请求将不会往下继续执行,开始按照同级别定义的process_response方法, 按照注册了中间件类中的顺序从下到上依此返回.如果在返回的途中的process_response方法没有使用自定义的HttpResponse对象的形式返回, 那么最终返回的结果就按照process_request方法返回的HttpResponse对象为准如果在返回的途中的process_response方法自定义的自己的HttpResponse对象,那么将会按照当前HttpResponse返回的结果作为标准. 同时如果上一层也定义了,就按照上一层的结果返回.# 基本使用from django.utils.deprecation import MiddlewareMixinclass MyMiddleware(MiddlewareMixin):def process_request(self, request)...def process_response(self, request, response):...return response# 三种了解自定义: process_view, process_template_response, process_exception# process_view在路由匹配之前视图函数执行之前触发执行顺序: 在注册了的中间件类中从上到下# process_template_response在视图函数返回的HttpResponse对象含有render属性时触发执行顺序: 在注册了的中间件类中从下到上# process_exception在视图函数执行过程中抛出异常时触发执行顺序: 在注册了的中间件类中从下到上# csrf跨站请求伪造# csrf 全称 cross site request forgery  跨站请求伪造# 什么是CSRF就是基于不同的服务端发送出相同的展示页面, 假的页面与真的页面展示给用户看时候一模一样,在用户输入敏感信息的时候, 提交的不是用户想提交的内容, 而是隐藏在标签中的内容,虽然都是提交到同一个正规服务器, 但是提交的数据内容不是用户指定的了. 而是隐藏的内容.# 本质:钓鱼网站不提供用户输入的name属性值, 而是提供自己指定的隐藏的写好的name以及对应的value# 规避:在给用户返回一个具有提交数据的功能页面的时候附加一个唯一标识,在用户提交请求过来的时候, 服务端效验这个请求中是否含有对应的唯一标识,如果有则正常执行 如果没有则拒绝并返回403 forbbiden# 争对form与ajax的符合校验设置来解决CSRF问题# 争对form在返回的页面书写 {% csrf_token %}# 争对ajax: 在data参数中指定方式一: data: {'csrfmiddlewaretoken': $('[name=csrfmiddlewaretoken].val()')}方式二: {'csrfmiddlewaretoken': `{{ csrf_token }}`}方式三: 自定义js文件copy代码. 再配置静态文件导入.# csrf相关装饰器from django.utils.decorators.csrf import csrf_protect, csrf_exempt# 争对FBV@csrf_protect# @csrf_exemptdef index(request):if request.method == 'POST':return HttpResponse('index')return render(request, 'index.html')# 争对CBVcsrf_protect三种方式都可以csrf_exempt只争对dispatch方法有效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/211001.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件开发王者搭配:80%低代码+20%高代码

数字化领域从来不缺新概念&#xff0c;前两年市场大谈云原生、技术中台、业务中台等概念&#xff0c;企业更多聚焦在业务与IT架构的升级。而这两年&#xff0c;随着低代码、生成式AI的盛行&#xff0c;大家则开始挖掘数字化应用的低成本建设模式。 在过去&#xff0c;开发一套系…

Linux基础命令4

find查找操作 1.文件名 上图中&#xff0c;一共有4个部分&#xff0c;分别是find&#xff0c;搜索路径&#xff0c;-name&#xff0c;文件名 find加上文件的路径&#xff08;也就是要查找的文件在根目录下的usr目录下的bin目录底下&#xff09; 加上 -name 加上文件名&a…

docker 安装常用环境

一、 安装linux&#xff08;完整&#xff09; 目前为止docker hub 还是被封着&#xff0c;用阿里云、腾讯云镜像找一找版本直接查就行 默认使用latest最新版 #:latest 可以不写 docker pull centos:latest # 拉取后查看 images docker images #给镜像设置标签 # docker tag […

MySQL锁机制

前置 锁理论 锁总结 锁实践 记录锁 间隙锁 临键锁 对数据库的操作有读、写&#xff0c;组合起来就有 读读、读写、写读、写写&#xff0c;读读不存在安全问题&#xff0c;安全问题加锁都可以解决&#xff0c;但所有的操作都加锁太重了&#xff0c;只有写写必须要求加锁&…

组合数学学习

指数生成函数可以与排列结合在一起&#xff0c;而幂级数和 组合结合在一起 如果要进行计算的值不是一个具体的值&#xff0c;那么就要考虑生成函数

【Linux】:消息队列和信号量

信号 一.消息队列1.原理2.消息队列的各种接口1.创建消息队列2.释放消息队列3.发送和接收信息 二.信号1.概念2.各种接口1.创建信号量2.销毁信号量3.对信号量进行操作 三.一个现象 一.消息队列 1.原理 这种消息队列被称为system V标准。 可以使用ipcs -q来查询消息队列&#xff…

某基金公司赵哥“逆袭”了!!!

赵哥&#xff0c;在上海一家基金公司做运维主管。 平时工作的首要任务&#xff0c;就是保障公司各项信息系统的安全运行。 万一系统运行中出现了一些重要问题&#xff0c;他还要负责进行调查、记录与汇报... 总之&#xff0c;责任很重&#xff0c;该说不说&#xff0c;搞不好…

gitt开源项目的意义,公司为什么会对在gitt上有开源项目的人更大机会

Git是一种分布式版本控制系统&#xff0c;它可以帮助程序员管理代码的历史版本和协同工作。同时&#xff0c;Git也成为了开源项目的主要托管平台之一。Git的开源项目意义重大&#xff0c;因为这种开源项目托管平台可以帮助开发者将代码和项目分享给全球的开发者&#xff0c;并且…

Sui第七轮资助:八个项目共获得超过50万美元的资助

今日&#xff0c;Sui基金会宣布了本月获得资助的项目方&#xff0c;他们将获得超过50万美元的资助金&#xff0c;用于构建项目&#xff0c;推动Sui的采用和发展。要获得资助&#xff0c;项目必须提交提案&#xff0c;详细说明他们正在构建的内容、预算明细、关键里程碑、团队经…

Excel中出现“#NAME?”怎么办?(文本原因)

excel 单元格出现 #NAME? 错误的原因有二&#xff1a; 函数公式输入不对导致 #NAME? 错误。 在单元格中字符串的前面加了号&#xff0c;如下图中的--GoJG7sEe6RqgTnlUcitA&#xff0c;本身我们想要的是--GoJG7sEe6RqgTnlUcitA&#xff0c;但因为某些不当的操作在前面加了号&…

基于单片机设计的大气气压检测装置(STC89C52+BMP180实现)

一、前言 本项目设计一个大气气压检测装置&#xff0c;该装置以单片机为基础&#xff0c;采用STC89C52作为核心控制芯片&#xff0c;结合BMP180模块作为气压传感器。大气气压&#xff0c;也就是由气体重力在大气层中产生的压力&#xff0c;其变化与天气预报、气象观测以及高度…

猫罐头选哪个牌子?口碑好的5款猫罐头推荐给新手养猫人!

很多人家里的哈基米是不是吃猫粮吃腻了&#xff0c;或者猫猫平时不喜欢喝水&#xff0c;又或者看猫猫太瘦了想入手几款猫罐头但是又愁于不会选择。而且现在猫罐头风这么大不知道选什么好~ 作为一个从事宠物行业7年的宠物店店长&#xff0c;看到很多新手羊毛人来店里咨询怎么给猫…