CSRF_TOKEN跨站请求伪造

发布时间 2023-12-20 18:55:43作者: 朱饱饱

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))