首页 > 其他分享 >Django操作session和中间件以及csrf跨站服务

Django操作session和中间件以及csrf跨站服务

时间:2023-05-07 19:56:12浏览次数:46  
标签:跨站 return process 中间件 request Django session response

Django操作session

# cookie保存在浏览器,数据不安全
session可以将用户信息保存在服务端,基于cookie工作的
1. 用户信息认证
2. 生成随机字符串
3. 随机字符串和用户信息绑定一起,保存,默认在mysql
4. 把随机字符串返回到浏览器,将其保存,再次访问直接带其一起传输至服务端,服务端用其进行查询,存在则已经登录过

# 在Django中默认使用session,则必须有Django——session表
在cookie中session保存的key默认是sessionid
默认的过期时间是14天

def set_session(request):  # 设置session
    # 当django设置多个值的时候,Django_session表中也只会有一条数据(一台计算机一个浏览器,只会有一条记录)
    """
        1. 生成一个随机字符串
        2. 默认保存到Django_session表中
            2.1 在中间件中操作的
            2.2 请求来的时候,把数据保存在缓存中
            2.3 响应走的时候,才执行了create方法
        3. 把随机字符串返回给浏览器
    :param request:
    :return:
    """
    request.session['username'] = 'lisi'
    return HttpResponse('session')

def get_session(request):  # 获取session
    """
        1. 获取名为session的cookie值
        2. 拿着这个cookie去数据库查询
        3. 查询到后,把这个数据封装到request.session中
    :param request:
    :return:
    """
    print(request.session.get('username'))
    print(request.session['username'])
    return HttpResponse('get_session')

def sel_session(request):  # 删除session
    request.session.delete()  # 只删数据库
    request.session.flush()  # 数据库和cookie都删除
    return HttpResponse('del_session')

# cookie和session的又一个区别:
1. cookie设置数据有大小限制
2. session理论上没有

CBV中加装饰器

from django.views import View
from django.utils.decorators import method_decorator

@method_decorator(login_auth, name='get')  # 也可以加在类上面但是要加一个name指明给哪个方法加装饰器
class Login(View):
    @method_decorator(login_auth)  # 重写dispatch,并加上装饰器,可以给所有的方法加装饰器
    def dispatch(self, request, *args, **kwargs):
        return super(Login, self).dispatch(request, *args, **kwargs)
    
    @method_decorator(login_auth)  # CBV中加装饰器
    def get(self, request):
        return HttpResponse('get')

    def post(self, request):
        return HttpResponse('post')

Django的中间件

# django的请求声明周期流程图
1. 请求来了先经过中间件
2. 响应走了最后,也要经过中间件

# django自带的有七个中间件
在配置文件下的MIDDLEWARE这个里面的7个中间件

django的中间件给我们暴露了一些方法
class SessionMiddleware(MiddlewareMixin):
     def process_request(self, request):
            session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)
            request.session = self.SessionStore(session_key)

     def process_response(self, request, response):
        return response
    
# 它提供了几个方法
1. 需要我们掌握的有:
	process_request
    process_response
2. 了解的方法:
	process_view----------------》是跟视图函数相关的
    process_exception----------------》跟异常相关的
    process_template_response----------------》跟模板相关的
    
# 在一个中间件中,暴露的这几个方法不是每个类都必须有的,而是需要什么就写什么

自定义中间件

# django除了默认提供了7个中间件,还支持自己定义中间件

自定义中间件的步骤:
1. 在项目名下或者应用名下新建一个任意名称的文件夹
2. 在这个文件夹下面新建一个py文件
3. 在这个py文件中,新建一个类,必须继承MiddlewareMixin
4. 在你新建的这个类下面写哪几个方法:
	process_request
    process_response
5. 一定要在配置文件的中间件里面注册你的中间件路径

# 针对process_reqeust
	1. 执行顺序是按照配置文件中注册的顺序,从上往下依次执行
    2. 视图函数在中间件的process_request函数之后执行
    3. 如果在process_request里面直接返回HttpResponse,之后的中间件一律不在走了,包括视图函数
# # 针对process_response
 	1. 必须要返回一个HttpResponse
    2. 执行顺序:是按照配置文件的注册顺序,从下往上依次执行

# 最后一个问题:
研究我在第一个中间件的process_reqeust方法中,直接返回HttpResponse,然后,观察所有中间件的process_response的执行顺序?
# 结论:如果在第一个中间件中得process_reqeust中直接拦截,只走第一个中间件的process_reqeust和第一个中间件的process_response,直接原路返回.

# 但是,在flask框架中,如果你在第一个拦截了,后面的类似于是process_response都会走一遍.
'''flask框架中实际上没有真正的中间件,它是需要你看源码自己做成类似于django的这种中间件'''

csrf跨站请求伪造

# 背景信息
钓鱼网站
“钓鱼网站”的页面与真实网站界面基本一致,欺骗消费者或者窃取访问者提交的账号和密码信息
eg:
	现在有一个正规的中国银行的网站,我自己也写一个页面根中国银行的页面完全一模一样
    有个客户去中国银行转行,不小心来到了我的这个钓鱼网站,开始在这个钓鱼网站转账,转账完毕之后,钱也少了,这个也达到了中国银行,但是,它想转账的这个对方账户不是它自己想要的哪个账户.
    
# 针对上述情况,它是怎么做到的
# 内部本质
在钓鱼网站上的form表单中,它是写一个没有name属性的input框,它在这个input框下面,在隐藏一个input框,这个隐藏的input框,我给他提前写好name属性和value值,但是用户不知道

# 如何规避上述问题?
在正规网站中给form表单一个唯一标识,然后,表单每次提交的时候,后端都做一个验证没如果正确就可以提交,如果不正确,就直接403(forbidden)


# 来研究ajax如何规避csrf的验证?
  $('.btn').click(function () {
        $.ajax({
            url: '',
            type: 'post',
            // 方式1:
            {#data: {'username': 'kevin', 'csrfmiddlewaretoken': $("[name='csrfmiddlewaretoken']").val()},#}
            // 方式2
            {#data: {'username': 'kevin', 'csrfmiddlewaretoken': '{{ csrf_token }}'},#}
            data: {'username': 'kevin'},
            // 方式3,使用js
            success: function (res) {

            }
        })
    })

标签:跨站,return,process,中间件,request,Django,session,response
From: https://www.cnblogs.com/juzixiong/p/17379961.html

相关文章

  • csrf跨站请求伪造,相关校验,装饰器
    csrf跨站请求伪造钓鱼网站:模仿一个正规的网站让用户在该网站上做操作但是操作的结果会影响到用户正常的网站账户但是其中有一些猫腻 eg:英语四六级考试需要网上先缴费但是你会发现卡里的钱扣了但是却交到了一个莫名其妙的账户并不是真正的四六级官方账户模拟钓......
  • django-datatable-view==0.9.0 Django 3.1.3: ImportError:无法导入名称'FieldDoesNot
    问题答案来自于:https://cloud.tencent.com/developer/ask/sof/891274源码:fromdjango.db.models.fieldsimportFieldDoesNotExist 替换:fromdjango.core.exceptionsimportFieldDoesNotExist......
  • Django笔记三十七之多数据库操作(补充版)
    本文首发于公众号:Hunter后端原文链接:Django笔记三十七之多数据库操作(补充版)这一篇笔记介绍一下Django里使用多数据库操作。在第二十二篇笔记中只介绍了多数据库的定义、同步命令和使用方式,这一篇笔记作为补充详细介绍如何对Django系统的多个数据库进行针对的建表同步操......
  • Python进阶:Day1什么django框架,怎么使用,用在哪里?
    前言:django框架大家好,我是辣条好久没有更新高能作品了,从今天开始我不定期更新系列作品,可能会偏向于中高级,没有基础的同学们可以看我往期的基础博文哦~亦或者直接通过文末底下名片直接找到辣条~废话不多说我们直接开始Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV......
  • Django笔记三十六之单元测试汇总介绍
    本文首发于公众号:Hunter后端原文链接:Django笔记三十六之单元测试汇总介绍Django的单元测试使用了Python的标准库:unittest。在我们创建的每一个application下面都有一个tests.py文件,我们通过继承django.test.TestCase编写我们的单元测试。本篇笔记会包括单元测试的......
  • Django高级之-分页器
    目录分页推导queryset对象的切片参数数据总页数获取循环看需要展示几个li推导分页的原理代码终极大法自定义分页器封装代码自定义分页器使用后端前端分页推导分页的几个参数:当前第几页总数据量有多少(从数据库中查询出来)每页展示20条(自己规定的)总数据量/每页展示的条数......
  • Django框架——cookie与session简介、django操作cookie与session、django中间件
    cookie与session简介"""回忆:HTTP协议四大特性 1.基于请求响应 2.基于TCP、IP作用于应用层之上的协议 3.无状态 不保存客户端的状态 4.无连接"""最开始的网站都不需要用户注册所有人来访问获取到的数据都是一样的随着互联网的发展很多网站需要指定当前用户的状态cook......
  • Django与Ajax
    目录一什么是Ajax二Ajax语法三案例1.通过Ajax,实现前端输入两个数字,服务器做加法,返回到前端页面2.前端反序列化的不同方式方式1:前端js反序列化方式2:ajax设置dataType参数方式3:Django的序列化模块四前后端传输数据的编码格式(理论)1.application/x-www-form-urlencoded2.multipa......
  • RabbitMQ - 消息中间件
    RabbitMQ-消息中间件目录RabbitMQ-消息中间件1消息队列Rabbitmq介绍1.0什么是消息队列1.1rabbitmq介绍1.2MQ解决的问题1.3常见的消息队列及比较2RabbitMQ介绍安装2.1下载2.2安装(1)window安装(2)linux下安装rabbitmq(3)docker安装2.3配置web管理插件(1)windows配置(2)centos7......
  • django中间件
    目录一、django中间件什么是中间件?如何自定义中间件二、django中间件三个了解的方法三、django中间件五个方法的执行流程详解四、基于django中间件的功能设计功能设计介绍如何利用字符串导入模块功能模拟一、django中间件什么是中间件?官方的说法:中间件是一个用来处理Django的......