Django框架之中间件、CSRF跨站请求伪造

一、中间件

1.什么是中间件

  中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。

  中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。

2.Django中的中间件

django默认有7个中间件

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',
]

用户在自定义中间件里面可以写5种方法

process_request:请求来的时候从上往下依次执行每一个中间件里面的process_request

process_response :响应走的时候会从下往上依次执行每一个中间件里面的process_response方法

process_view:路由匹配成功执行视图之前自动触发(从上往下依次执行)
    
process_exception:当视图函数报错了,自动触发(从下往上依次执行)
    
process_template_response:视图函数返回的对象有一个render()方法
                        (或者表明该对象是一个TemplateResponse对象或等价方法)

3.自定义中间件

  新建任意名字的文件夹,里面新建任意名字py文件

  导入:from django.utils.deprecation import MiddlewareMixin

  自定义中间件完成后在setting文件中注册

from django.utils.deprecation import MiddlewareMixin

class MyMiddleware(MiddlewareMixin):
    def process_request(self,request):
        print('我是第一个自定义中间件里面的process_request方法')
        # return HttpResponse('heiheihei')

    def process_response(self,request,response):
        print('我是第一个自定义中间件里面的process_response方法')
        return response  # 必须将response形参接收的到数据返回,不然直接报错

    def process_view(self, request, view_func, view_args, view_kwargs):
        print('我是第一个自定义中间件里面的process_view方法')
        print(view_func.__name__,view_func)

    def process_exception(self,request,exception):
        print('我是第一个自定义中间件里面的process_exception方法')
        print(exception)

    def process_template_response(self,request,response):
        print('我是第一个自定义中间件里面的process_template_response方法')
        return response


class MyMiddleware1(MiddlewareMixin):
    def process_request(self,request):
        print('我是第二个自定义中间件里面的process_request方法')

    def process_response(self,request,response):
        print('我是第二个自定义中间件里面的process_response方法')
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        print('我是第二个自定义中间件里面的process_view方法')
        print(view_func.__name__,view_func)

    def process_exception(self,request,exception):
        print('我是第二个自定义中间件里面的process_exception方法')
        print(exception)

    def process_template_response(self,request,response):
        print('我是第二个自定义中间件里面的process_template_response方法')
        return response
自定义中间件

二、跨站请求伪造

1.什么是跨站请求伪造

  CSRF跨站请求伪造,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。

  可以这样来理解: 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。

2.跨站请求伪造使用

在form表单中跨站请求伪造

<form action="" method="post">
    {% csrf_token %}
    <p>用户名:<input type="text" name="name"></p>
    <p>密码:<input type="text" name="password"></p>
    <p><input type="submit"></p>
</form>

在Ajax中使用

<button class="btn">点我</button>
</body>
<script>
    $(".btn").click(function () {
        $.ajax({
            url: '',
            type: 'post',
            data: {
                'name': $('[name="name"]').val(),
                'password': $("#pwd").val(),
                'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val()},
            success: function (data) {console.log(data)}
            })
    })
</script>

FBV中使用

from django.views.decorators.csrf import csrf_exempt,csrf_protect
    @csrf_exempt  # 局部禁用(前提是全站使用)
    def index1(request):
        return HttpResponse('ok')

    @csrf_protect  # 局部校验csrf(前提是全站禁用)
    def index2(request):
        return HttpResponse('ok')

CBV中使用

csrf_protect 和正常的CBV装饰器一样 3种

csrf_exempt 只能加在类或者dispatch上

from django.views import View
from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django.utils.decorators import method_decorator
# 加在类上只能指定方法为dispatch, @method_decorator(csrf_exempt,name='dispatch') class Test(View):
# @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return super().dispatch(request, *args, **kwargs) def get(self,request): return render(request,'index.html') def post(self,request): print(request.POST) return HttpResponse('ok')

 

posted @ 2019-06-18 20:55  西西灬弗斯  阅读(135)  评论(0编辑  收藏  举报