csrf跨站请求伪造
我们在网上缴费时通常会遇到一些钓鱼网站和真正的网站长得一模一样,我们在网站中进行金额操作钱被扣了可是我们需要的东西并没有得到,其实就是这个钓鱼网站向正式的网站发送了请求(form表单中的提交网址),顺便把我们填写的数据转账人改掉了。
在我们填写被转账人的时候其实标签根本没有name属性,还有一个标签填写好了name属性与value值并且做了隐藏
标签隐藏 style="display: none"
csrf校验策略
我们要避免上述情况出现,我们就需要在页面上添加唯一标识一起发送给服务端,服务端会校验唯一标识。没有则拒绝
我们平时发送post请求时会报错我们注释掉配置文件中的中间件就可以访问了,该中间件就是做唯一标识校验。
添加唯一标识方法
form 表单内填写
{% csrf_token%}
ajax
date内填写
方法1:
{#data:{'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()},#}
方法2:
{#data:{ 'csrfmiddlewaretoken':'{{ csrf_token }}','username':'jason'},#}
"后面是可以携带需要的键值对"
方法3:
方式3:直接引入一个js脚本
参考网站:https://www.cnblogs.com/Dominic-Ji/p/9234099.html
"放入一个js文件并引入"
csrf装饰器
多个视图函数或类其中一个不想效验那么就可以用到装饰器了。
from django.views.decorators.csrf import csrf_exempt,csrf_protect
FBV添加的方式
@csrf_exempt # 不校验
@csrf_protect # 校验
# CBV添加装饰器的方式
from django.utils.decorators import method_decorator
@method_decorator(csrf_protect, name='post') # 方式2:单独方法生效(给类里的post添加装饰器 需要给name指定)
class MyView(views.View):
method_decorator(csrf_protect) # 方式3:整个类中所有方法生效
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
@method_decorator(csrf_protect) # 方式1:单独方法生效
def post(self, request):
return HttpResponse('from cbv post view')
注意:"取消校验方法只能使用在 dispatch 方法上才能生效"
标签:protect,name,校验,csrf,post,decorator
From: https://www.cnblogs.com/LiaJi/p/17004534.html