Django大回顾 - 8 中间件、csrf认证相关

【1】中间件

中间件是什么?

        中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能

 


作用:

        1 、全局的请求拦截---》如果它没有登录---》就不允许访问
        2、 拦截所有请求,获取请求的ip地址
        3、 记录所有用户的访问日志
        4、 统一在响应头中加数据

        【1.1】中间件方法

# 1、
process_request(self,request) # 请求来了,就会走

# 2、
process_response(self, request, response) # 请求走了就会走

# 3、
process_view(self, request, callback, callback_args, callback_kwargs) #视图函数执行之前调用

# 4、
process_template_response(self,request,response) # 渲染模板之前会走

# 5、
process_exception(self, request, exception) # 视图函数中出现异常了才执行

        【1.2】django内置中间件

'''
django内置一些中间件---》增强了djagno的功能
request.session
request.user
post 请求提交数据,拦截了---》csrf认证

'''


MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    # session相关的中间件
    'django.contrib.sessions.middleware.SessionMiddleware',
    # 公共中间件---》访问不带 / 路径,如果有 带 / 的路径,他会让你重定向到这个地址
    'django.middleware.common.CommonMiddleware',
    # csrf认证    xss  cors
    'django.middleware.csrf.CsrfViewMiddleware',
    # 认证:request.user--->这个中间件做的
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    # django的消息框架---》flask--》闪现
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

        【1.3】自定义中间件

# 自定义中间件来使用,记录用户的请求地址和user-agent
class SaveRemoteAddr(MiddlewareMixin):
    def process_request(self, request):
        # request 是WSGIRequest 的对象
        # print(request.session) # 一定要保证,session的中间件要在上面
        # 这个request 就是当次请求的request
        # 取出ip
        ip = request.META.get('REMOTE_ADDR')
        user_agent = request.META.get('HTTP_USER_AGENT')
        print(ip)
        print(user_agent)
        # return HttpResponse('不让你看了') # 不会再走视图函数了
        '''
        能返回的情况:
            1 None,表示执行完这个代码,继续往后执行---》还有中间件,继续执行--》最后进视图函数
            2 四件套,后续不走了,中间件的process_response---》直接返回给浏览器了
        '''

        【1.4】中间件,在响应头加入访问时间

import datetime
class AddHeaderMiddleWare(MiddlewareMixin):
    def process_response(self, request, response):
        # request中有没有session? 有
        # request 如果在视图函数中,往request中放了值,在这里,就可以取出来 request.xxx
        # print(request.xxx)
        # 所有cookie中都带
        # response.set_cookie('xxxxx', 'asdfds')
        # 写入到响应头,访问服务端的时间
        response['ttt'] = datetime.datetime.now()
        return response  # 一定要返回response对象

【2】csrf认证相关

1、csef:跨站请求伪造

 


2、攻击原理:

            -在同一个浏览器中,如果登录了A网站,没有退出,在B网站中,向A网站发送请求,浏览器会自动携带A网站的cookie,对于A网站后端来讲, 它就分辨不清到底是用户真实发的请求,还是黑客网站发的请求【都会携带用户真实的cookie】
     

3、如何防范:

        

# 如何防范:
	-django解决了这个问题---》只要发送post请求,必须携带一个csrf_token 随机字符串--->后端给的
    -这个随机字符串可以带的位置?
    	1 请求体中(urlencoded,form-data):{csrfmiddlewaretoken:asdfasdf}
        2 放在请求头中:'X-CSRFToken':asdfasdfasd
        3 ajax提交数据:默认是urlencoded,放在请求体中没有任何问题
           $.ajax({
            method: 'post',
            data: {username, password, csrfmiddlewaretoken},
            success: function (res) {
                console.log(res)
            }
        })
            
       4 ajax提交,使用json格式---》就不能放在请求体中
    	只能放在请求头中:
          $.ajax({
            method: 'post',
            headers:{'X-CSRFToken':csrfmiddlewaretoken},
            contentType: 'application/json',
            data: JSON.stringify({username, password}),
            success: function (res) {
                console.log(res)
            }
        })
            
            
            
# post 提交的数据,都是从request.POST中取,前提是:必须是urlencoded和form-data格式
# 如果是json是取不到的


# 如果使用ajax发送请求
	redirect  render就用不了了
    尽量使用JsonResponse

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值