• Django生命周期,中间件(MiddlewareMixin)与csrf(跨站请求伪造),XSS攻击 (跨站请求脚本攻击)


    Django生命周期

     浏览器 - server -  中间件 - process_request(中间件处理请求) - 路由 - process_view - 在返回中间件过滤 - process_response (中间件处理响应)  - 返回Server - 返回浏览器

    中间件( MiddlewareMixin )

    简介

    # 中间件是什么
    请求和响应之间的一道屏障
    
    # 中间件的作用
    控制请求和响应

    中间件的执行顺序

    # process_request 请求的时候,从上往下执行
    如果return HttpResponse的对象,直接返回了。如果return None 继续往下走
    # process_response ,从下往上执行
    必须 return HttpResponse的对象

    中间件的方法

    # 中间件1直接返回, HttpResponse对象,直接走自己的response
    def
    process_request(self,request): # 请求来的时候,响应执行 def process_response(self,request,response): # 响应回去的时候,执行
    def process_view(self,request,callback,callback_args,callback_kwargs): print(callback) # 视图层函数内存地址 print(callback_args) # 接受路由无名分组参数 print(callback_kwargs) # 接受路由有名分组参数 ret = callback(request) # 执行视图层函数 return ret def process_exception(self, request, exception) # 接受错误信息(了解) # 该方法对视图函数的返回值又要求,必须是一个含有render方法类的对象,才会执行此方法 [ 例如以下例子 ] def process_template_response(self, request, response) #(了解)
    class Test(): def render(self): return HttpResponse('test') def test_middle(request): # 会触发render函数的执行 return Test()

    自定义中间件

    from django.utils.deprecation import MiddlewareMixin
    class
    MyMiddelware(MiddlewareMixin): # 继承MiddlewareMixin类   def process_request(self,request): # 发送请求来的时候执行   print('我是Middleware ----- 1 process_request ')   return None # 接着往下走
        # return HttpResponse # 直接放回,不往下走
      
    def process_response(self,request,response): # 响应回去的时候执行   print('我是Middleware ----- 1 process_response ')
        # response.set_cookie('name', 'lqz') 给全局写入cookie
        return response
      def process_view(self,request,callback,callback_args,callback_kwargs):   # 所有视图函数
        print(callback) # 拿到函数
        print(callback_args) # 函数位置参数
        print(callback_kwargs) # 函数关键字参数
        ret
    = callback(request) # 执行函数
        return ret

      def process_exception(self,request,exception):
        print(exception) # 捕捉异常信息

      def process_template_response(self,request,response):
        return response # 该方法对视图函数的返回值又要求,必须是一个含有render方法类的对象,才会执行此方法

    注册中间件

    csrf  (跨站请求伪造)

    csrf是什么

    攻击者盗用你的身份,以你的名义发送恶意请求,服务器来说这个请求是合法的

    防范csrf (django用的第二中)

    # 方法一:refer 验证发送请求的地址,每一次发送者的地址
    # 方法二:加一个随机字符串校验(加载请求的路径里,加在请求体中)
    # 方法三:在请求头中加字符串校验
    # form表单提交(随机字符串放在请求体中
    <form action="" method="post">
        {% csrf_token %}   # 添加随机字符串
        {{ csrf_token }}
        <p>name: <input type="text" name="name"></p>
        <p>name: <input type="text" name="pwd"></p>
        <input type="submit" value="提交">
    </form>
    
    # ajax提交(随机字符串放在请求体中)
    $("#btn").click(function () {
        $.ajax({
            url: '/auth/',
            type: 'post',
            data: {
                'name': $('[name="name"]').val(),
                'pwd': $('[name="pwd"]').val(),
                'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val(),  # 添加随机字符串(推荐使用)
                //'csrfmiddlewaretoken': '{{ csrf_token }}',  # 添加随机字符串
            },
            success: function (data) {
                alert(data)
            }
        })
    })
    
    # ajax 提交(随机字符串放在请求头中)[ js操作cookie ]   ( 不推荐使用 )
    $("#btn").click(function () {
        var token = $.cookie('csrftoken');
        $.ajax({
            url: '/auth/',
            headers: {'X-CSRFToken': token}, # 添加在请求头里
            type: 'post',
            data: {
                'name': $('[name="name"]').val(),
                'pwd': $('[name="pwd"]').val(),
            },
            success: function (data) {
                alert(data)
            }
        })
    })

    局部禁用( csrf_exempt )与 局部使用( csrf_protect )   

     装饰fbv

    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    # 装饰fbv
    @csrf_exempt  # 局部禁用,全局使用
    def func(request):
      return HttpResponse('ok')
    
    @csrf_protect  # 局部使用,全局禁用
    def func(request):
      return HttpResponse('ok')

    装饰cbv(只能装饰在类上或者dispatch方法上)

    from django.views.decorators.csrf import  csrf_exempt,csrf_protect
    from django.utils.decorators import method_decorator
    from django.views import View
    
    @method_decorator(csrf_protect,name='dispatch')  # 装饰在类上
    class Csrf_disable(View):
        # @method_decorator(csrf_protect)  # 或者装饰在 dispatch 方法上
        def dispatch(self, request, *args, **kwargs):
            ret=super().dispatch(request, *args, **kwargs)  # 调用父类的dispatch方法
            return ret
    
        def get(self,request):
            return HttpResponse('ok')
    
        def post(self,request):
            return HttpResponse('post---ok')

    XSS攻击 (跨站请求脚本攻击)

    攻击原理

    程序员写一段脚本语言,恶意攻击你的网站

    防范XS攻击

    # 前台渲染用:safe 模板语言能解析标签
    # {{ article_obj.content|safe }}
    soup = BeautifulSoup(content,"html.parser")   # 防xss攻击,解析标签
    all_tag = soup.find_all()
    for i in all_tag:
        if i.name == "script":
            i.decompose()   # 删除script标签  
    作业:
    1 登录认证,写在中间件中(只有登录的请求不需要登录以后操作,其他请求,都必须登录以后操作)
    2 写一个频率控制的中间件(任意用户,一分钟只能访问3次)应用上csrf
    -思路:
    -当前访问的ip地址取出来
    -存一个临时变量{ip:[时间1,时间2,时间3]}

  • 相关阅读:
    ArrayList源码解析
    HashSet的实现原理
    Spark Streaming之四:Spark Streaming 与 Kafka 集成分析
    Spark Streaming之三:DStream解析
    Spark Streaming之二:StreamingContext解析
    curl与wget区别
    MongoDB之二(增删查改)
    Thread之九:stop
    mysql实战优化之九:MySQL查询缓存总结
    PBE加密算法
  • 原文地址:https://www.cnblogs.com/sq1995liu/p/13129507.html
Copyright © 2020-2023  润新知