目录
csrf与auth认证
今日内容概要
- csrf跨站请求伪造
- csrf校验策略
- csrf相关装饰器
- auth认证模块
- auth认证相关模块及操作
- 扩展auth_user表
今日内容详细
csrf跨站请求伪造
钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但是操作的结果会影响到用户正常的网站账户 但是其中有一些猫腻
eg:英语四六级考试需要网上先缴费 但是你会发现卡里的前扣了但是却交到了一个莫名其妙的账户 并不是真正的四六级官方账户
模拟钓鱼网站案例:转账案例
内部隐藏标签
思考:如何区分真假网站页面发送的请求
csrf校验策略
在提交数据的位置添加唯一标识
1.form表单csrf策略
form表单内部添加{% csrf_token %}
2.ajax请求csrf策略
// 方式1:自己动手取值 较为繁琐
{#data:{'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()},#}
// 方式2:利用模板语法自动获取(一定要用引号引起来)
{#data:{ 'csrfmiddlewaretoken':'{{ csrf_token }}','username':'jason'},#}
// 方式3:直接引入一个js脚本即可(官网提供的)
参考:https://www.cnblogs.com/Dominic-Ji/p/9234099.html
csrf相关装饰器
整个django项目都校验csrf 但是某些个视图函数\类不想校验
整个django项目都不校验csrf 但是某些个视图函数\类需要校验
FBV添加装饰器的方式(与正常函数添加装饰器一致)
from django.views.decorators.csrf import csrf_exempt, csrf_protect
# @csrf_exempt
@csrf_protect
def transfer_func(request):pass
CBV添加装饰器的方式(与正常情况不一样 需要注意)
主要有三种方式
# @method_decorator(csrf_protect, name='post') # 方式2:单独生效
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')
注意有一个装饰器是特例只能有一种添加方式>>>:csrf_exempt
只有在dispatch方法添加才会生效
'''
from django.shortcuts import render, HttpResponse, redirect
# Create your views here.
from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django import views
from django.utils.decorators import method_decorator
@method_decorator(csrf_protect, name='post') # 方式2:单独生效
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')
# @csrf_exempt # 取消校验 全局校验,我不想校验
# @csrf_protect # 添加校验 全局不校验,我想校验
def tran_func(request):
if request.method == 'POST':
username = request.POST.get('username')
target_name = request.POST.get('target_name')
money = request.POST.get('money')
print(f'{username}给{target_name}转了{money}')
return render(request, 'tranPage.html')
'''
auth认证模块
前戏:Django自带一个admin路由 但是需要我们提供管理员账号和密码
如果想要使用admin后台管理 需要先创建表 然后创建管理员账号
直接执行数据库迁移命令即可产生默认的auth_user表 该表就是admin后台管理默认的认证表
1.创建超级管理员
python38 manage.py createsuperuser
基于auth_user表编写用户相关的各项功能
登录,校验用户是否登录,修改密码,注销登录等
标签:protect,request,校验,auth,认证,csrf,method
From: https://www.cnblogs.com/zpf1107/p/17009141.html