1 跨站请求伪造
2 代码演示
3 django解决了csrf攻击,中间件:django.middleware.csrf.CsrfViewMiddleware
4 后期中间件不能注释,每次发送post请求,都需要携带csrf_token随机字符串
-form表单提交
-在form表单中 {% csrf_token%}
-ajax提交(如何携带)
方式一:放到data中
$.ajax({ url: '/csrf_test/', method: 'post', data: {'name': $('[name="name"]').val(), 'password': $('[name="password"]').val(), 'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val() }, success: function (data) { console.log('成功了') console.log(data) }, error: function (data) { console.log('xxxxx') console.log(data) } })
方式二:放到data中
'csrfmiddlewaretoken':'{{ csrf_token }}'
方式三:放到头中
headers:{'X-CSRFToken':'{{csrf_token}}'},
# jquery.cookie.js
-在浏览器中对cookie进行增,删,查,改
-前后端分离(js操作cookie)
# 全局使用,局部禁csrf
-在视图函数上加装饰器
from django.views.decorators.csrf import csrf_exempt,csrf_protect # 全局启用,局部禁用(中间件不能注释,这个视图函数,已经没有csrf校验了) # @csrf_exempt # def csrf_test(request): # if request.method=='GET': # return render(request,'csrf_test.html') # else: # name=request.POST.get('name') # password=request.POST.get('password') # print(name) # print(password) # return HttpResponse('登录成功')
# 全局禁用,局部使用csrf
@csrf_protect def csrf_test(request): if request.method=='GET': return render(request,'csrf_test.html') else: name=request.POST.get('name') password=request.POST.get('password') print(name) print(password) return HttpResponse('登录成功')
# 其他使用方式,在urls.py中
path('csrf_test/', csrf_exempt(views.csrf_test))