csrf中间件
csrf跨站请求伪造
Django框架中请求伪造保护机制
装饰器
from django.views.decorators.csrf import csrf_exempt,csrf_protect
- csrf_exempt 加在视图上,表示当前视图不进行csrf校验
- csrf_protect 加在视图上,表示当前视图进行csrf校验
注意点:
CBV情况,csrf_exempt装饰器要加在dispatch上
- process_request(self, request):
从cookie中获取csrftoken的值 —— 》 request.META['CSRF_COOKIE']
- process_view:
- 判断视图是否加上csrf_exempt,
- 有就不在进行csrf校验
- 没有继续进行校验
- 判断请求方式是'GET', 'HEAD', 'OPTIONS', 'TRACE',
- 是的话,不进行校验
- 不是的话,进行校验
3.进行校验的:
1、
csrf_token = request.META.get('CSRF_COOKIE') # csrf_token = cookie中获取csrftoken的值
2、
先尝试从request.POST获取csrfmiddlewaretoken对应的值 request_csrf_token = request.POST.get('csrfmiddlewaretoken', '') # 获取隐藏标签的csrfmiddlewaretoken对应的值 再尝试从请求头中获取X-csrftoken的值 request_csrf_token = request.META.get(settings.CSRF_HEADER_NAME, '')
3、拿csrf_token和request_csrf_token 进行对比
-
对比成功,校验成功
-
对比不成功,校验失败,拒绝