csrf跨站请求伪造
1.简介
钓鱼网站:假设是一个跟银行一模一样的网址页面 用户在该页面上转账
账户的钱会减少 但是受益人却不是自己想要转账的那个人
2.模拟
一台计算机上两个服务端不同端口启动 钓鱼网站提交地址改为正规网站的地址
3.预防
csrf策略:通过在返回的页面上添加独一无二的标识信息从而区分正规网站和钓鱼网站的请求
csrf操作
1.form表单
在任意位置导入csrf代码即可
<form action="" method="post">
{% csrf_token %}
</form>
2.ajax
方式1:先编写csrf模板语法 然后利用标签查找和值获取 手动添加
'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()
方式2:直接利用模板语法即可
'csrfmiddlewaretoken':'{{ csrf_token }}' # 隐号不能省略
方式3:通用方式(js脚本)
扩展性最高
将文件配置到你的Django项目的静态文件中,在html页面上通过导入该文件即可自动帮我们解决ajax提交post数据时校验csrf_token的问题,(导入该配置文件之前,需要先导入jQuery,因为这个配置文件内的内容是基于jQuery来实现的)
csrf相关装饰器
1.当整个网站默认都不校验csrf 但是局部视图函数需要校验 添加装饰器
2.当整个网站默认都校验csrf 但是局部视图函数不需要校验 如何处理
-----------------------------FBV------------------------------
from django.views.decorators.csrf import csrf_protect,csrf_exempt
"""
csrf_protect 校验csrf
csrf_exempt 不校验csrf
"""
@csrf_protect
@csrf_exempt
def home(request):
return HttpResponse('哈哈哈')
-----------------------------CBV-----------------------------
针对CBV不能直接在方法上添加装饰器 需要借助于专门添加装饰器的方法
from django.views.decorators.csrf import csrf_protect,csrf_exempt
from django.utils.decorators import method_decorator
@method_decorator(csrf_protect, name='post') # name参数可以指定给哪个方法添加默认全部
class MyHome(views.View):
@method_decorator(csrf_protect) # 方式3:影响类中所有的方法
def dispatch(self, request, *args, **kwargs): # 在源码中路由匹配成功之后执行此方法后才执行其他方法
super(MyHome, self).dispatch(request, *args, **kwargs)
def get(self, request):
return HttpResponse('Home Get view')
@method_decorator(csrf_protect) # 方式1指名道姓添加
def post(self, request):
return HttpResponse('Home Post view')
针对csrf_exempt只有方式3有效 针对其他装饰器上述三种方式都有效,在dispatch方法上加才有效
调父类方法后需要返回
auth认证模块
1.创建管理员身份
python3 manage.py createsuperuser
django执行数据库迁移命令之后会产生一个auth_user表
该表可以配合auth模块做用户相关的功能:注册 登录 修改密码 注销 ...
该表还是django admin后台管理默认的表
2.登陆装饰器
from django.contrib.auth.decorators import login_required # 登陆装饰器
@login_required(login_url='/login/') #校验用户跳转地址默认登陆复杂可以自定义到我们自己的登陆地址
或者在配置文件中配置LOGIN_URL = '/login/' 直接使用即可
from django.contrib import auth
from django.contrib.auth.decorators import login_required # 登陆装饰器
# @login_required(login_url='/home/') #校验用户跳转地址默认登陆复杂可以自定义
def login(request):
# print(request.user)
"""
登陆成功返回当前用户对象执行了auth.login
没登陆成功返回匿名用户对象没有执行auth.login
"""
# print(request.user.is_authenticated) # 判断用户是否已经登陆
if request.method == 'POST':
name = request.POST.get('username')
pwd = request.POST.get('password')
# 查询数据库数据此时没有表
user_obj = auth.authenticate(request, username=name, password=pwd) # 自动会将数据加密再校验
if user_obj:
auth.login(request, user_obj) # 自动操作cookie和session
"""数据正确返回数据对象,错误返回None"""
return render(request, 'login.html')
@login_required('/login/') # 指定路径跳转识别用户如果没有登陆自动跳转
def reg(request):
return HttpResponse('from reg view')
@login_required
def index(request):
return HttpResponse('from index')
3.修改密码
登陆状态下才能修改
判断原密码是否正确
#检验密码是否正确
is_right = request.user.check_password(old_password)
if is_right:
#修改密码
request.user.set_password(new+password)
#保存数据
request.user.save()
重置密码的业务判断用户手机号或者绑定邮箱证明是用户本人发送修改连接直接修改即可
4.注销
auth.logout(request) #开设接口直接访问自动清除cookie和session
5.注册功能
导入管理的表
from django.contrib.auth.models import User
def register(request):
User.objects.create_user(username='jason', password=123) # 创建普通用户
User.objects.create_superuser(username='tony', password=321,'email=666@.qq.com') # 创建超级用户需提供联系方式
auth模块常见方法
django执行数据库迁移命令之后会产生一个auth_user表
该表可以配合auth模块做用户相关的功能:注册 登录 修改密码 注销 ...
该表还是django admin后台管理默认的表
django admin后台管理员账号创建
python manage.py createsuperuser
auth模块常见功能
1.创建用户
from django.contrib.auth.models import User
User.object.create_user(username,password)
User.object.create_superuser(username,password,email)
2.校验用户名和密码是否正确
from django.contrib import auth
auth.authenticate(request,username,password)
3.用户登录
auth.login(request,user_obj)
4.判断用户是否登录
request.user.is_authecticated
5.获取登录用户对象
request.user
6.校验用户登录装饰器
from django.contrib.auth.decorators import login_required
跳转局部配置
login_required(login_url='/login/')
跳转全局配置
LOGIN_URL = '/login/'
7.校验密码是否正确
request.user.check_password(old_password)
8.修改密码
request.user.set_password(new_passowrd)
request.user.save()
9.注销登录
auth.logout(request)
10.request.content_type
查看前端传数据的编码格式
auth表切换
1.models.py
from django.contrib.auth.models import AbstractUser
class Userinfo(AbstractUser):
'''扩展auth_user表中没有的字段'''
phone = models.BigIntegerField()
desc = models.TextField()
2.settings.py
AUTH_USER_MODEL = 'app01.Userinfo'
需要在配置文件中配置代码已经执行过数据库迁移的就不能换了必须用新的数据库
实力化表之后所以操作基于自己创的表来操作 表名是自己创的表