• 2019.03.24 中间件


    不明白呀,中间件    对请求前处理  响应后处理

    保护吗?还是怎么着,也没说清楚。我也看不懂

     中间件和csrf之间的底层源码关系。太复杂了看不懂啊

    我的天   就一层保护的东西吧

    123  views 321 

    实现步骤

    1. 项目根目录下创建python package

    2. 自定义一个python文件

    #coding=utf-8

    from django.utils.deprecation import MiddlewareMixin

    class Row1(MiddlewareMixin):
      def process_request(self, request):
          print("中间件1")
      def process_response(self, request, response):
          print("中间件1返回")
          return response
    # 参数里的 response :就是views里面返回的值,所以要继续返回一下,否则客户端收不到数据

    class Row2(MiddlewareMixin):
      def process_request(self, request):
          print("中间件2")
           
      def process_response(self, request, response):
          print("中间件2返回")
          return response

    class Row3(MiddlewareMixin):
      def process_request(self, request):
          print("中间件3")
      def process_response(self, request, response):
          print("中间件3返回")
          return response
    1. settings文件中配置自定义中间件


    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',
      'middle.my.Row1',
      'middle.my.Row2',
      'middle.my.Row3',
    ]
    1. 配置URL


    from django.conf.urls import url, include
    from django.contrib import admin

    urlpatterns = [
      url(r'^admin/', admin.site.urls),
      url(r'^student/', include('student.urls')),
    ]


    #coding=utf-8

    from django.conf.urls import url
    import views

    urlpatterns=[
      url(r'^$',views.IndexView.as_view()),
     
    ]

    5.创建视图


    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals

    from django.http import HttpResponse
    from django.views import View

    # Create your views here.
    class IndexView(View):
      def get(self,request,*args,**kwargs):
          print u'最终返回值'
          return HttpResponse('OK')
           
    1. 浏览器访问:http://127.0.0.1:8000/student/

    2. 运行结果:


    中间件1
    中间件2
    中间件3
    最终返回值
    中间件3返回
    中间件2返回
    中间件1返回




    1. 在每个中间件中添加以下代码:


    def process_view(self, request, view_func, view_func_args, view_func_kwargs):
          # view_func 对应 views函数,view_func_args、kwargs 对应 views里的参数、
          print("中间件1view")


    1. 运行效果:


    中间件1
    中间件2
    中间件3
    中间件1view
    中间件2view
    中间件3view
    最终返回值
    中间件3返回
    中间件2返回
    中间件1返回

    1. 其他:views函数如果出现异常,返回会找exception方法,一级一级往上找,如果有处理返回,如果都没有处理就直接返回报错了。

          

    def process_exception(self, request, exception):
    if isinstance(exception, ValueError):
    return HttpResponse("出现异常")
    # 异常处理 views函数里出错了,执行这里,如views里 int('abc')

    process_template_response(self,request,response)
    # 如果views中的函数返回的对象中,具有render方法,执行这个方法。

     

    功能:1.解析隐藏域标签

               2.将随机字符串存放至request.META['CSRF_COOKIE']='随机字符串'

    生成随机字符串并赋值到Cookie中

     

    CSRF(Cross Site Request Forgery, 跨站请求伪造)

    CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一。其他安全隐患,比如 SQL 脚本注入,跨站域脚本攻击等在近年来已经逐渐为众人熟知,很多网站也都针对他们进行了防御。然而,对于大多数人来说,CSRF 却依然是一个陌生的概念。即便是大名鼎鼎的 Gmail, 在 2007 年底也存在着 CSRF 漏洞,从而被黑客攻击而使 Gmail 的用户造成巨大的损失。

    Django的解决方法

    Django预防CSRF攻击的方法是在用户提交的表单中加入一个csrftoken的隐含值,这个值和服务器中保存的csrftoken的值相同,这样做的原理如下:

    1. 在用户访问django的可信站点时,django反馈给用户的表单中有一个隐含字段csrftoken,这个值是在服务器端随机生成的,每一次提交表单都会生成不同的值

    2. 当用户提交django的表单时,服务器校验这个表单的csrftoken是否和自己保存的一致,来判断用户的合法性

    3. 当用户被csrf攻击从其他站点发送精心编制的攻击请求时,由于其他站点不可能知道隐藏的csrftoken字段的信息这样在服务器端就会校验失败,攻击被成功防御

    Django防攻击策略

    1. 不推荐禁用掉django中的CSRF。

    2. 我们可以再html页面的form表单中添加csrf_token,带着表单的请求一起发送到服务器去验证。

    <form action  method="post" >
      {% csrf_token %}
    </form>
    1. 在后端一定要使用render()的方法返回数据。


    return render(request, 'index.html', {'hello': '123})

    全局:

    中间件 django.middleware.csrf.CsrfViewMiddleware

    局部:

    @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。

    @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

    exempt:免除

    注意:from django.views.decorators.csrf import csrf_exempt,csrf_protect
  • 相关阅读:
    645. 错误的集合『简单』
    1078. Bigram 分词『简单』
    1018. 可被 5 整除的二进制前缀『简单』
    1010. 总持续时间可被 60 整除的歌曲『简单』
    1417. 重新格式化字符串『简单』
    1413. 逐步求和得到正数的最小值『简单』
    1394. 找出数组中的幸运数『简单』
    1374. 生成每种字符都是奇数个的字符串『简单』
    1365. 有多少小于当前数字的数字『简单』
    1360. 日期之间隔几天『简单』
  • 原文地址:https://www.cnblogs.com/Py-king/p/10588438.html
Copyright © 2020-2023  润新知