csrf跨站请求伪造
网站在提交表单时一般是通过post请求朝一个网站提交信息,然后这个网址通过request.POST的方式拿到数据。
投机分子仿造了一个前端一摸一样的钓鱼网站,并且表单提交的地址也是跟真实网址一个地址,那他就可以在提交数据前做一些非法手段。
例如提交数据前 更改数据的值等 篡改表单数据。
为了避免这种情况,我们应该保证我们网站只能接收我们网站自己发来的post请求,这里就用到了csrf校验
csrf校验
当我们收到post请求时,我们先查看是否是带有我们网站的csrf令牌,这样来确保接收的都是正确的数据,都是来自于本网站的数据。
如果post请求没有csrf标识,那我们就可以直接拒绝访问
如果添加csrf标示
form表单内部添加 {% csrf_token %}
{% csrf_token %}
ajax请求csrf策略
利用模板语法自动获取(一定要用引号引起来)
{data:{'csrfmiddlewaretoken':'{{ csrf_token }}','username':'jason'}}
方式2:直接引入一个js脚本即可(官网提供的)
参考:https://www.cnblogs.com/Dominic-Ji/p/9234099.html
csrf中间件
位置实际上就是我们之前经常注释掉的第四个中间件:
'django.middleware.csrf.CsrfViewMiddleware'
默认全局开启 所有的post请求都需要有csrf校验
它的逻辑是,当进来一个post请求(也有可能是除get外的其他请求)时,会对其进行csrfmiddlewaretoken的校验,如果有这么一个信息属性,那么比对这个信息是否有效,如果没有或者信息不对直接拒绝,这也就是前期在学习提交post表单请求时为什么会被403权限拦截的原因。
csrf校验装饰器
有时我们的csrf校验并不想全局设置,那么我们就可以给视图函数加装csrf装饰器让其取消或者添加csrf校验:
from django.views.decorators.csrf import csrf_exempt, csrf_protect
# 要导入这两个模块才可以生效
@csrf_exempt
# 取消这个视图函数的csrf校验
def gogogo(request):pass
@csrf_protect
# 单独添加csrf校验
def transfer(request):pass
# 这样就可以注销csrf校验的中间件 单独给个别函数设置校验
如何给CBV添加装饰器
基于FBV也就是视图函数我们是可以直接添加装饰器的,但是我们要是给视图类是不可以直接添加的 需要借助模块添加
类中某个功能添加
from django.utils.decorators import method_decorator # 视图类加装饰器必须借助这个模块
class MyView(views.View):
def get(request):pass
@method_decorator(login_auth)
# 通过这个模块来装上装饰器('装饰器名字')
def post(request):pass
给整个类添加装饰器
分发函数dispatch继承下来,因为执行视图类的所有函数都会经过这个dispatch,我们只需要在这个函数上加装装饰器就可以让每种请求都加装装饰器。
class MyView(views.View):
@method_decorator(login_auth)
# 这个类的所有方法都加登录认证
def dispatch(self, request, *args, **kwargs):
# 直接给父类的dispatch方法添加装饰器,
# 其实没有对这个父类方法做任何改变只是加了装饰器
return super().dispatch(request, *args, **kwargs)
def get(request):
pass
def post(request):
pass
标签:request,校验,添加,CBV,csrf,post,装饰
From: https://www.cnblogs.com/moongodnnn/p/17009066.html