zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Android Studio 单刷《第一行代码》系列 05 —— Fragment 基础
    Android Studio 单刷《第一行代码》系列 04 —— Activity 相关
    Android Studio 单刷《第一行代码》系列 03 —— Activity 基础
    Android Studio 单刷《第一行代码》系列 02 —— 日志工具 LogCat
    Android Studio 单刷《第一行代码》系列 01 —— 第一战 HelloWorld
    IDEA 内网手动添加oracle,mysql等数据源,以及server returns invalid timezone错误配置
    eclipse maven设置
    IntelliJ IDE 常用配置
    eclipse maven 常见问题解决方案
    Maven 安装和配置
  • 原文地址:https://www.cnblogs.com/Py-king/p/10588438.html
Copyright © 2011-2022 走看看