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
posted @ 2019-03-24 15:35  AJking  阅读(169)  评论(0编辑  收藏  举报