首页 > 编程语言 >python之路56 csrf跨站请求 auth模块登录注册方法

python之路56 csrf跨站请求 auth模块登录注册方法

时间:2022-12-26 12:03:10浏览次数:43  
标签:username 跨站 python 56 request auth user csrf password

csrf跨站请求伪造

钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但是操作的结果会影响到用户正常的网站账户 但是其中有一些猫腻
    eg:英语四六级考试需要网上先缴费 但是你会发现卡里的钱扣了但是却交到了一个莫名其妙的账户 并不是真正的四六级官方账户
        
模拟钓鱼网站案例:转账案例
	内部隐藏标签
   
思考:如何区分真假网站页面发送的请求

csrf校验策略

在提交数据的位置添加唯一标识

1.form表单csrf策略
   form表单内部添加{% csrf_token %}
2.ajax请求csrf策略
<script src="/static/myjs.js"></script>
<script>
    $('#d1').click(function(){
        $.ajax({
            url:'',
            type:'post',
            // 方式1:自己动手取值 较为繁琐
            {#data:{'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()},#}
            // 方式2:利用模板语法自动获取(一定要引号引起来)
            {#data:{'csrfmiddlewaretoken':'{{ csrf_token  }}','username':'jason'},#}
            // 方式3:引用一个js脚本(官方提供)
            data:{},
            success:function(args){

            }
        })
    })
</script>
参考: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添加装饰器的方式(与正常情况不一样 需要注意)
主要有三种方式
from django import views
from django.utils.decorators import method_decorator

# @method_decorator(csrf_protect,name='post') # 方式2 单独生效
class MyViews(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
    只有在dispathch方法添加才会生效

auth认证模块

前夕:django自带一个admin路由 但是需要我们提供管理员账户和密码
如果想要使用admin后台管理  需要先创建表 然后创建管理员账号
直接执行数据库迁移命令即可产生默认的auth_user表 该表就是admin后台管理默认的认证表
1.创建超级管理员
    python38 manage.py createsuperuser
    
基于auth_user表编写用户相关的各项功能
     登录、校验用户是否登录、修改密码、注销登录等

auth认证相关模块及操作

from django.contrib import auth
from django.contrib.auth.models import User
1.用户注册功能
def register_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 1.校验用户是否存在
        # res = auth.authenticate(request,username=username,此处缺密码)  必须把密码也传进去
        # print(res)
        res = User.objects.filter(username=username)
        if res:
            return HttpResponse('用户名已存在')
        # 2.注册该用户
        # User.objects.create(username=username,password=password)  # create方法不可以使用 密码不加密
        User.objects.create_user(username=username,password=password) # 正常创建 对密码加密
    return render(request,'registerPage.html')
2.判断用户名和密码是否正确
def login_func(request):
    print(request.user)
    print(request.user.is_authenticated)  # 判断当前用户对象是否已登录
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 1.校验用户名和密码是否正确(不分开校验) 自己无法比对密码 必须要使用auth模块提供的方法才可以
        user_obj = auth.authenticate(request,username=username,password=password) # 得到用户对象
        # print(user_obj.password)
        if user_obj:
            # 2.用户登录成功(返回给客户端登录成功的凭证、令牌、随机字符串)
            auth.login(request,user_obj)   # 自己操作django_session表
            '''
            当执行完上述的操作之后我们就可以通过request.user直接获取到当前登录的用户对象数据
            '''
            return HttpResponse('登录成功!!!')

    return render(request,'loginPage.html')
3.判断用户是否登录
	request.user.is_authenticated
4.获取登录用户对象数据
	request.user
5.校验用户是否登录装饰器
from django.contrib.auth.decorators import login_required
# @login_required(login_url='/login/')  # 可以明确指定用户没有登录之后跳转到那个地址 局部配置
@login_required  # 在settings添加 LOGIN_URL = '/login/'    全局配置
def index_func(request):
    return HttpResponse('index页面,只有登录的用户才可以查看')
6.校验原密码是否正确
request.user.check_password(原密码)
7.修改密码
request.user.set_password(新密码)
request.user.save() #  一定要保存
8.退出登录
auth.logout(request)

扩展auth_user表

还想使用auth模块的功能 并且又想扩展auth_user表的字段
思路1:一对一字段关联
思路2:替换auth_user表
    步骤1:模型层编写模型类继承AbstractUser
  from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser):
    # 填写AbstractUser表中没有的字段
    phone = models.BigIntegerField()
    desc = models.TextField()
步骤2:一定要在配置文件中声明替换关系
   AUTH_USER_MODEL = 'app01.UserInfo'
ps:替换还有一个前提 就是数据库迁移没有执行过(需要一个新库,就是auth相关表没有创建) 

标签:username,跨站,python,56,request,auth,user,csrf,password
From: https://www.cnblogs.com/xm15/p/17005426.html

相关文章

  • python-操作符
    1.python-操作符有什么用操作符图解操作符:一个特定的符号,用它与其他数据类型连接起来组成一个表达式。常用于条件判断,根据表达式返回True/False采取动作。2.比......
  • python-条件判断
    1.python-条件判断条件判断流程图语法格式if<表达式>:<代码块>elif<表达式>:<代码块>else:<代码块>条件判断-单分支语句示例:判断是否成年age......
  • rk3568 | rk平台GPIO冲突检测小技巧
    上一篇我们讲解了如何编写gpio驱动,但是实际操作中,经常发现gpio引脚被占用的情况发生,那么本篇文章就详细讲解rxw平台下如何快速定位gpio复用问题以及如何解决。一、GPIO寄......
  • python-循环
    1.python-循环在了解编程中的“循环”之前,先试想下这个场景:在阳台种花,准备种4颗种子,开始逐个挖坑,放一颗种子。每一颗种子操作都是相同的,如果我们用一步将6颗种子重......
  • python-for循环
    1.python-for循环循环详解图for语句:一般用于遍历数据类型的元素进行处理,例如字符串、列表。循环语法格式:for<变量>in<序列>:<代码块>示例代码示例1......
  • python-while综合案例猜年龄
    1.综合案例-猜年龄#!/usr/bin/envpython3#_*_coding:utf-8_*_#Author:shichao#File:.pya=0while1:ifa<3:age=int(input("请输入年......
  • python-while循环语句
    1.python-while循环语句while循环详细图while语句:在某条件下循环执行一段代码,即重复相同的任务while语法格式:while<表达式>: <代码块>while语法示例:......
  • python-文件操作
    1.python-文件操作1.1open函数​ 要想读取文件(如txt、csv等),第一步要用open()内建函数打开文件,它会返回一个文件对象,这个对象拥有read()、write()、close()等方法。......
  • python-字符串拼接
    1.python-字符串拼接使用“+”可以对多个字符串进行拼接。示例:str1="hello"str2="world"print(str1+str2)其他方式:格式化输出逗号join()内建函......
  • python 字符串格式化输出
    1.python字符串格式化输出示例代码#变量赋值name="张三"avg=22height=1.75方法1、使用(%s%d%f)格式化输出print("我的名字叫:%s,我的年龄是:%d,我......