不明白呀,中间件 对请求前处理 响应后处理
保护吗?还是怎么着,也没说清楚。我也看不懂
中间件和csrf之间的底层源码关系。太复杂了看不懂啊
我的天 就一层保护的东西吧
123 views 321
实现步骤
-
项目根目录下创建python package
-
自定义一个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
-
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',
]
-
配置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
中间件2
中间件3
最终返回值
中间件3返回
中间件2返回
中间件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
中间件2
中间件3
中间件1view
中间件2view
中间件3view
最终返回值
中间件3返回
中间件2返回
中间件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的值相同,这样做的原理如下:
-
在用户访问django的可信站点时,django反馈给用户的表单中有一个隐含字段csrftoken,这个值是在服务器端随机生成的,每一次提交表单都会生成不同的值
-
当用户提交django的表单时,服务器校验这个表单的csrftoken是否和自己保存的一致,来判断用户的合法性
-
当用户被csrf攻击从其他站点发送精心编制的攻击请求时,由于其他站点不可能知道隐藏的csrftoken字段的信息这样在服务器端就会校验失败,攻击被成功防御
Django防攻击策略
-
不推荐禁用掉django中的CSRF。
-
我们可以再html页面的form表单中添加csrf_token,带着表单的请求一起发送到服务器去验证。
<form action method="post" >
{% csrf_token %}
</form>
-
在后端一定要使用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