CSRF和中间件

CSRF使用

说明csrf存在cookie中

全局使用

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

局部使用

先导入

from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

前端使用

1.通过引入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);
}
}
});

2、作为参数传入

<script>
var csrftoken = $.cookie('csrftoken');
$(function () {
$('#btn').click(function () {
$.ajax({
url:'/login/',
type:"POST",
data:{'username':'root','pwd':'123123'},
header:{'X-CSRFtoken':csrftoken},
success:function (arg) { }
})
})
})
</script>

3、自定义form引入

{% csrf_token %}

中间件

1.概述

定义:中间件是在wsgi之后 urls.py之前 在全局 操作Django请求和响应的模块!

# 中间件的相关设置
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # request.session 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'my_middleware.OoXx',
'my_middleware.MD2',
]

2.中间件的五种方法

(1) .process_request(self,request)

请求来时执行,不写直接跳过,执行下一个中间件;当有return HttpResonse时,下面中间件不再执行。

执行顺序:
按照注册的顺序(在settings.py里面设置中 从上到下的顺序)
何时执行:
请求从wsgi拿到之后
返回值:
返回None,继续执行后续的中间件的process_request方法
返回response , 不执行后续的中间件的process_request方法

(2) process_view(self, request, callback, callback_args, callback_kwargs)

先执行process_request,执行完后,再从起始执行proces_view

执行顺序:
按照注册的顺序(在settings.py里面设置中 从上到下的顺序)
何时执行:
在urls.py中找到对应关系之后 在执行真正的视图函数之前
返回值:
返回None,继续执行后续的中间件的process_view方法
返回response,

(3)  process_template_response(self,request,response)

如果Views中的函数返回的对象中,具有render方法,此方法执行

执行顺序:
按照注册顺序的倒序(在settings.py里面设置中 从下到上的顺序)
何时执行:
视图函数执行完,在执行视图函数返回的响应对象的render方法之前
返回值:
返回None,继续执行后续中间件的process_exception
返回response,

(4).  process_exception(self, request, exception)

异常触发执行,当views.py函数执行出错后,此方法执行;出错时,最低层的exception优先级最高,执行最近的一个,然后执行respnse方法

执行顺序:
按照注册顺序的倒序(在settings.py里面设置中 从下到上的顺序)
何时执行:
视图函数中抛出异常的时候才执行
返回值:
返回None,继续执行后续中间件的process_exception
返回response,

(5). process_response(self, request, response)

请求返回时执行,不写时直接跳过,执行下一个中间件;当有return HttpResonse时,会替换原数据

执行顺序:
按照注册顺序的倒序(在settings.py里面设置中 从下到上的顺序)
何时执行:
请求有响应的时候
返回值:
必须返回一个response对象

以上方法的返回值可以是None和HttpResonse对象,如果是None,则继续按照django定义的规则向下执行,如果是HttpResonse对象,则直接将该对象返回给用户

Django调用 注册的中间件里面五个方法的顺序:
1. process_request
urls.py
2. process_view
view
3. 有异常就执行 process_exception
4. 如果视图函数返回的响应对象有render方法,就执行process_template_response
5. process_response

3.自定义中间件

创建文件 my_middleware.py

from django.shortcuts import HttpResponse, redirect

"""
自定义的中间件
"""
from django.utils.deprecation import MiddlewareMixin # 定义一个可以访问的白名单
URL = ["/oo/", "/xx/", "/haha/"] class OoXx(MiddlewareMixin): def process_request(self, request):
print("这是我的第一个中间件:OoXx!")
print(id(request))
# print(request.path_info)
# # 如果用户访问的URL 在 白名单里面
# if request.path_info in URL:
# return
# # 否则 直接返回一个 响应 不走视图那部分了
# else:
# return HttpResponse("gun!") def process_response(self, request, response):
"""
:param request: 是浏览器发来的请求对象
:param response: 是视图函数返回的响应对象
:return:
"""
print("这是OOXX中间件里面的 process_response")
# return response
return HttpResponse("hahahaha") def process_view(self, request, view_func, view_args, view_kwargs):
""" :param request: 浏览器发来的请求对象
:param view_func: 将要执行的视图函数的名字
:param view_args: 将要执行的视图函数的位置参数
:param view_kwargs: 将要执行的视图函数的关键字参数
:return:
"""
print("ooxx里面的process_view")
print(view_func, type(view_func))
return HttpResponse("ooxx:process_view") def process_exception(self, request, exception):
print(exception)
print("ooxx里面的process_exception")
return redirect("http://www.baidu.com") def process_template_response(self, request, response):
print("ooxx 中的process_template_response")
return response def process_request(self, request):
request.s10 = {"is_login": 1, "name": "s10"} class MD2(MiddlewareMixin): # def process_request(self, request):
# print("这是我的第二个中间件:MD2!")
# print(id(request))
#
# def process_response(self, request, response):
# print("这是MD2中间件里面的 process_response")
# return response
#
# def process_view(self, request, view_func, view_args, view_kwargs):
# print("MD2里面的process_view")
# print(view_func, type(view_func))
# return HttpResponse("md2:process_view") # def process_exception(self, request, exception):
# print(exception)
# print("MD2里面的process_exception") # def process_template_response(self, request, response):
# print("MD2 中的process_template_response")
# return response def process_request(self, request):
print(request.s10.get("is_login"))

注册

# 中间件的相关设置
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # request.session 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'my_middleware.OoXx',
'my_middleware.MD2',
]

请求测试

from django.shortcuts import render, HttpResponse, redirect

# Create your views here.

def index(request):
print("这是app01里面的index视图函数...")
# raise ValueError("sb")
rep = HttpResponse("O98K")
print("视图函数中的s10:", request.s10)
def render():
print("我是index视图函数内部的render方法")
return redirect("http://www.luffycity.com") rep.render = render
return rep

django csrf 中间件的更多相关文章

  1. django—csrf中间件校验流程

    CSRF(跨站请求伪造)是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法. 这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求 ...

  2. 30.Django CSRF 中间件

    CSRF 1.概述 CSRF(Cross Site Request Forgery)跨站点伪造请求,举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果某个用户已经登录到你的网站上了,那么当这个用 ...

  3. 7.Django CSRF 中间件

    CSRF 1.概述 CSRF(Cross Site Request Forgery)跨站点伪造请求,举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果某个用户已经登录到你的网站上了,那么当这个用 ...

  4. Django对中间件的调用思想、csrf中间件详细介绍、Django settings源码剖析、Django的Auth模块

    目录 使用Django对中间件的调用思想完成自己的功能 功能要求 importlib模块介绍 功能的实现 csrf中间件详细介绍 跨站请求伪造 Django csrf中间件 form表单 ajax c ...

  5. Python之路-(Django(csrf,中间件,缓存,信号,Model操作,Form操作))

    csrf 中间件 缓存 信号 Model操作 Form操作 csrf: 用 django 有多久,我跟 csrf 这个概念打交道就有久了. 每次初始化一个项目时都能看到 django.middlewa ...

  6. Django的csrf中间件

    csrf中间件 ​ csrf 跨站请求伪造 ​ 补充两个装饰器: ​ from django.views.decorators.csrf import csrf_exempt,csrf_protect ...

  7. csrf 跨站请求伪造相关以及django的中间件

    django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware来完成. 1.django中常用的中间件? - proces ...

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

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

  9. Django 中CSRF中间件 'django.middleware.csrf.CsrfViewMiddleware',

    1.Django中CSRF中间件的工作原理及form表单提交需要添加{% csrf_token %}防止出现403错误 CSRF # 表示django全局发送post请求均需要字符串验证功能:防止跨站 ...

随机推荐

  1. HDU Ignatius and the Princess II 全排列下第K大数

    #include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include& ...

  2. linux内核编译 fatal error: openssl/opensslv.h: No such file or directory

    ubuntu下缺少了的组件,安装即可: sudo apt-get install libssl-dev

  3. css沉默

    css变色龙实现. ==== css 1 水平居中和垂直居中. 2 css布局方式. 3 你写过UI框架么.

  4. Java面试—消息队列

    消息队列面试题 题目来自于中华石杉,解决方案根据自己的思路来总结而得. 题目主要如下: 1. 为什么要引入消息队列? 消息队列的引入可以解决3个核心问题: 解耦 异步 削峰 解耦 在一个项目中,如果一 ...

  5. Java的开发—面向对象的7大原则之开闭原则(一)

    开闭原则(Open Close Principle) 一.定义: 软件中的(类.模块.函数等等)应该对于扩展是开放的,对于修改时关闭的.意味着一个实体允许在不改变它的源代码的前提变更它的行为 这里的软 ...

  6. Redis 为什么这么快?

    1. 纯内存操作,肯定快 数据存储在内存中,读取的时候不需要进行磁盘的 IO 2. 单线程,无锁竞争损耗 单线程保证了系统没有线程的上下文切换 使用单线程,可以避免不必要的上下文切换和竞争条件,没有多 ...

  7. 5.Android-电话拨号器详解

    之前学习了3.Android-ADT之helloworld项目结构介绍后,本章便来写个简单的电话拨号器程序. 实现的步骤如下所示: 1.创建项目 2.写layout/activity_main.xml ...

  8. Android Studio 快捷方式记录

  9. Zabbix3.4使用详解

    zabbix-基础 第1章 关于zabbix 1.1 为什么要使用监控 1.对系统不间断实时监控2.实时反馈系统当前状态3.保证服务可靠性安全性4.保证业务持续稳定运行 1.2 如何进行监控 比如我们 ...

  10. C# WPF之Material Design自定义颜色

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. C# WPF之Material Design自定义颜色 阅读导航 本文背景 代码实现 本文参考 ...