中间件

一、什么是中间件

请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models)

响应的时候也需要经过中间件才能到达web服务网关接口

django默认的七个中间件

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

二、django中间件作用(********)

1.网站全局的身份校验,访问频率限制,权限校验。。。只要是涉及到全局的校验你都可以在中间件完成

2.django的中间件是所有web框架中做的最好的

三、中间件执行顺序

-process_request()方法,从上往下执行
1.如果返回 HttpResponse对象,那么会直接返回,不再往下执行而是跳到同级别的process_response方法,直接往回走
2.请求来的时候,会经过每个中间件里面的process_request方法(从上往下)
-process_response,从下往上执行
1.必须要将response形参返回,这个形参指代的就是要返回给前端的数据
2.响应走的时候,会依次经过每一个中间件里面的process_response方法(从下往上)

 四、自定义中间件

1.导包

from django.utils.deprecation import MiddlewareMixin

2.定义类,继承MiddlewareMixin

在app01应用中创建一个文件夹mymiddleware,再创建一个mdd.py文件

class MyMdd(MiddlewareMixin):
def process_request(self,request):
print('我是第一个中间件里面的process_request方法') def process_response(self,request,response):
print('我是第一个中间件里面的process_response方法')
return responseclass MyMdd1(MiddlewareMixin):
def process_request(self,request):
print('我是第二个中间件里面的process_request方法') def process_response(self,request,response):
print('我是第二个中间件里面的process_response方法')
return response

3.定义视图函数

def index(request):
print("view函数...")
return HttpResponse("OK")

4.在settings中MIDDLEWARE注册自定义中间件

MIDDLEWARE =[
'mymiddleware.mdd.MyMdd',
'mymiddleware.mdd.MyMdd1',
'mymiddleware.mdd.MyMdd2', ]

5.设置路由

urlpatterns = [
url(r'^index/',view.index) ]

结果

我是第一个中间件里面的process_request方法
我是第二个中间件里面的process_request方法
view函数...
我是第二个中间件里面的process_response方法
我是第一个中间件里面的process_response方法

五、中间件五个可以自定义的方法

需要掌握的方法:

1.process_request()方法    请求来的时候会走该方法

1.请求来的时候 会经过每个中间件里面的process_request方法(从上往下)
2.如果方法里面直接返回了HttpResponse对象 那么会直接返回 不再往下执行
基于该特点就可以做访问频率限制,身份校验,权限校验

2.process_response()方法   响应回去的时候会走该方法

1.必须将response形参返回 因为这个形参指代的就是要返回给前端的数据
2.响应走的时候 会依次经过每一个中间件里面的process_response方法(从下往上)

需要了解的方法:

3.process_view()

在路由匹配成功执行视图函数之前 触发

4.process_exception()

当你的视图函数报错时,就会自动执行

5.process_template_response()

当你返回的HttpResponse对象中必须包含render属性才会触发
def index(request):
print('我是index视图函数')
def render():
return HttpResponse('什么鬼玩意')
obj = HttpResponse('index')
obj.render = render
return obj

总结:

你在书写中间件的时候,只要形参中有response,你就应该顺手将其返回,这个response就是要给前端的信息。

这五种方法有哪些特点:
1.都需要继承MiddlewareMixin
2.在注册中间件的时候,在settings中写的路径不能错

CSRF——跨站请求伪造

1.什么是CSRF攻击

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

比如钓鱼网站

2.CSRF攻击原理

要完成一次CSRF攻击,受害者必须依次完成两个步骤:

  1.登录受信任网站A,并在本地生成Cookie。

  2.在不登出A的情况下,访问危险网站B。

钓鱼网站例子

通过制作一个跟正儿八经的网站一模一样的页面,骗取用户输入信息 转账交易从而做手脚
转账交易的请求确确实实是发给了中国银行,账户的钱也是确确实实少了
唯一不一样的地方在于收款人账户不对
内部原理
在让用户输入对方账户的那个input上面做手脚
给这个input不设置name属性,在内部隐藏一个实现写好的name和value属性的input框
这个value的值 就是钓鱼网站受益人账号

如何区分钓鱼网站和正经网站?在正经网站返回页面的时候,在form表单中偷偷塞一个特殊的字符串,后端记下该页面对应的字符串的值,等用户发post请求来的时候,我先去校验特殊的字符串是否匹配

如何去写这个特殊的字符串呢?模版语法有一个固定的写法{% csrf_token %},必须写在form表单内

3.CSRF攻击防范

防止钓鱼网站的思路
网站会给用户访问的form表单页面 偷偷塞一个随机字符串
请求到来的时候 会先比对随机字符串是否一致 如果不一致 直接拒绝(403)

该随机字符串有以下特点
  1.同一个浏览器每一次访问都不一样
  2.不同浏览器绝对不会重复

4.CSRF在Django中的应用

1.在form表单中使用

<form action="" method="post">
{% csrf_token %}
<p>username:<input type="text" name="username"></p>
<p>password:<input type="text" name="password"></p>
<input type="submit">
</form>

2.在ajax中使用,如何避免csrf校验

  • 有两种方法,通过修改ajax的data

  方法一:先在form表单页面上写{% csrf_token%},利用标签查找,获取到该input键值消息

data{'username':'jason','csrfmiddlewaretoken':$('[name=csrfmiddlewaretoken]').val()}

  方法二:直接书写'{{csrf_token}}'

data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'}
  • 还可以将获取随机键值对的方法,写到一个js文件中,然后导入这个文件即可

  新建一个js文件,存放以下代码

function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken'); function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
} $.ajaxSetup({
beforeSend: function (xhr, settings) {
  if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});

5.CSRF禁用

1.CSRF全局禁用

注释掉settings中MIDDLEWARE的中间件 'django.middleware.csrf.CsrfViewMiddleware',

2.CSRF局部禁用

  • 在FBV中,直接加载FBV就行了 (在页面不加csrf_token情况下)
from django.views.decorators.csrf import csrf_exempt,csrf_protect
#(前提是全局使用,没有注释csrf) 让这个不用校验,可以局部使用
#当你网站全局需要校验csrf的时候,有几个不需要校验该如何处理
@csrf_exempt
def login(request):
return HttpResponse('login') #(前提是全局禁用,注释csrf,不会进行校验) 设置就会进行校验,局部禁用
#当你网站全局不校验csrf的时候,有几个需要校验又该如何处理
@csrf_protect
def lll(request):
return HttpResponse('lll')
  • 在CBV中,只能在dispatch方法或者类上面
from django.views import View
from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django.utils.decorators import method_decorator
# 这两个装饰器在给CBV装饰的时候 有一定的区别
如果是csrf_protect 那么有三种方式
# 第一种方式
# @method_decorator(csrf_protect,name='post') # 有效的
class MyView(View):
# 第三种方式
# @method_decorator(csrf_protect)
def dispatch(self, request, *args, **kwargs):
res = super().dispatch(request, *args, **kwargs)
return res def get(self,request):
return HttpResponse('get')
# 第二种方式
# @method_decorator(csrf_protect) # 有效的
def post(self,request):
return HttpResponse('post')
如果是csrf_exempt 只有两种(只能给dispatch装) 特例
@method_decorator(csrf_exempt,name='dispatch') # 第二种可以不校验的方式
class MyView(View):
# @method_decorator(csrf_exempt) # 第一种可以不校验的方式
def dispatch(self, request, *args, **kwargs):
res = super().dispatch(request, *args, **kwargs)
return res def get(self,request):
return HttpResponse('get') def post(self,request):
return HttpResponse('post')

Django框架(十二)-- 中间件、CSRF跨站请求伪造的更多相关文章

  1. Django Ajax学习二之csrf跨站请求伪造

    方式1 $.ajaxSetup({ data: {csrfmiddlewaretoken: '{{ csrf_token }}' }, }); 方式2 # html文件from表单中<form& ...

  2. django上课笔记3-ORM补充-CSRF (跨站请求伪造)

    一.ORM补充 ORM操作三大难点: 正向操作反向操作连表 其它基本操作(包含F Q extra) 性能相关的操作 class UserInfo(models.Model): uid = models ...

  3. django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块

    CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...

  4. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

  5. Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)

    Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造)   摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...

  6. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)

    一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...

  7. Django框架(十六)-- 中间件、CSRF跨站请求伪造

    一.什么是中间件 中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出 二.中间件的作用 如果你想修改请求,例如被传送到view ...

  8. 第三百一十五节,Django框架,CSRF跨站请求伪造

    第三百一十五节,Django框架,CSRF跨站请求伪造  全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...

  9. Django框架(十七)—— 中间件、CSRF跨站请求伪造

    目录 中间件 一.什么是中间件 二.中间件的作用 三.中间件执行顺序 四.自定义中间件 1.导包 2.定义类,继承MiddlewareMixin 3.在视图函数中定义一个函数 4.在settings的 ...

随机推荐

  1. C# 请求数据 方式1

    public static string PostWebRequest2() { HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create( ...

  2. Python中的异步任务队列 arq

    引言 最近在用 sanic 写东西,所有涉及到IO阻塞的代码都需要用 aio 的模块,好在近年来 asyncio 生态圈发展的还算不错,该有的都有 ~ 近期业务中 登录/注册 业务涉及的很复杂(涉及到 ...

  3. JavaScript 箭头函数

    ES6新标准增加了一种新的函数,箭头函数. x=>x*x 相当于: function (x){ return x*x; } 如果参数不是一个,就需要用括号()括起来: // 两个参数:var t ...

  4. pandas批量读取带有日期的文件夹简单操作

    工作中碰到了这样一个数据处理的问题,想让你把某个文件夹下的子文件夹中的excel表级联成为1张表,用excel来做会很浪费时间并且很劳累,这时候我们就可以用pandas来加大工作效率,只需要半个小时就 ...

  5. jQuery实现列表框双向选择操作

    对列表框的操作经常碰到过这样的应用:从左侧的列表框中选中要选的项添加到右侧列表框中,然后提交最终选择的项,对误操作而选中的项还可以执行移除操作.在很多系统中应用比如说求职网站的选择意向工作地区,QQ好 ...

  6. 如何查看电脑的GPU信息

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_33690342/article/ ...

  7. Centos7下把python 2.7升级到python 3.6(升级过程遇到的一些相关问题)

    Centos 7 默认安装的Python 的版本是2.7的,现在不少人用的是3.x上的版本,故而需要了解下如何从Python2.7升级到Python 3.6. 在虚拟机安装时,网络不通会先遇到一个错误 ...

  8. 微信小程序 调用远程接口,给全局数组赋值

    关键是 let that = this 因为在onLoad 的 wx.request方法里, this指的是 wx.request 的上下文, 所以应该是在 onLoad 的时候定义 let that ...

  9. 一行命令搞定/usr/bin/perl^M: bad interpreter

    https://www.cnblogs.com/albertYe/p/8819143.html **************************************************** ...

  10. delete some elements from the head of slice without new memory

    a = []int{1, 2, 3} a = append(a[:0], a[1:]...) // 删除开头1个元素 a = append(a[:0], a[N:]...) // 删除开头N个元素