python-pickle模块使用实例

本文介绍了一个简单的用户管理系统的设计与实现,包括用户登录、注册、密码验证等功能,并提供了完整的Python代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下代码主要实现的是用户登录,注册,密码验证,账户锁定,重置和修改密码等功能

import pickle
#第一次运行请去掉下面一段代码的注释
'''
users_db = open("users.txt","wb")
users_list = [["admin","admin",1],["tiannan","123456",1],["jide","123",0]]
#["admin","admin",1] -> [<用户名>,<密码>,<锁(是/否)>]
pickle.dump(users_list,users_db)
users_db.close()
'''

users_db=open("users.txt","rb")
users_list=pickle.load(users_db)
users_db.close()
#print(users_list)

#用户登录机会
users_pass = {}
for i in users_list:
    users_name = i[0]
    users_pass[users_name]=3
#users_pass = {"admin":3,"tiannan":3,"jide":3} -> {<用户名>:<可尝试登录次数>}
#print(users_pass)

def ha_user(user_name):
    no_user = "yes"
    for j, users_msg in enumerate(users_list):
        #print(i,users_msg)
        #判断用户名是否存在
        if user_name in users_msg:
            no_user = j
            break
    return no_user

def write_db():
    users_db = open("users.txt","wb")
    pickle.dump(users_list,users_db)
    users_db.close()
    
def change_password():
    password1 = input("请输入新密码:")
    password2 = input("请再次输入新密码:")
    if password1 == password2:
        users_list[index][1] = password1
        write_db()
        print("密码修改成功!")
    else:
        print("您输入的密码不一致!")
        
while True:
    sel = int(input("选择:<1>登录 <2>注册\n"))
    if sel == 1:
        name = input("请输入用户名:")
        password = input("请输入密码:")

        index = ha_user(name)
        if index == "yes":
            print("用户名不存在!")
        else:
            users_info = users_list[index]
            #判断用户是否处于锁定状态
            if users_info[-1] == 0:
                print("%s用户已被锁,请联系管理员解锁账户!" % users_info[0])
            else:
                if password == users_info[1]:
                    #重置账户锁定验证次数
                    users_pass[name]=3
                    print("登录成功!")
                    while name == "admin":
                        sel2 = int(input("请选择:<1>修改密码 <2>重置用户 <3>查看用户 <4>退出\n"))
                        if sel2 == 1:
                            change_password()
                        elif sel2 == 2:
                            name2 = input("请输入需要重置的用户名:")
                            index3 = ha_user(name2)
                            if index3 == "yes":
                                print("用户名不存在!")
                            else:
                                users_list[index3][1]= "123456"
                                users_list[index3][-1]= 1
                                write_db()
                                print("%s用户重置成功!" % name2)
                        elif sel2 == 3:
                            name2 = input("请输入查找的用户名:")
                            index2 = ha_user(name2)
                            if index2 != "yes":
                                print(users_list[index2])
                            else:
                                print("该用户不存在!")
                        elif sel2 == 4:
                            break   
                    while name != "admin":
                        sel3 = int(input("请选择:<1>修改密码 <2>退出\n"))
                        if sel3 == 1:
                            change_password()
                        elif sel3 == 2:
                            break
                else:
                    users_pass[name]-=1
                    if users_pass[name] > 0:
                        print("密码错误,你还有%d次机会,请重新登录!" % users_pass[name])
                    else:
                        users_list[index][-1]=0
                        write_db()
                        print("%s用户多次登录失败,已被锁,请联系管理员解锁账户!" % users_info[0])
    elif sel == 2:
        name = input("请输入用户名:")
        password = input("请输入密码:")

        result = ha_user(name)
        if result == "yes":
            user_list = [name,password,1]
            users_list.append(user_list)
            write_db()
            print("注册成功!")
        else:
            print("该用户名已被注册!")

 此代码仅供参考,欢迎各位博友的留言!

转载于:https://www.cnblogs.com/tiannan/p/6210613.html

### Python Pickle 模块的命令执行漏洞及其使用 `pickle` 是 Python 提供的一个用于对象序列化和反序列化的模块。它允许开发者将复杂的 Python 对象保存到文件或者网络传输中,并能够重新加载这些对象以便继续使用[^1]。然而,由于 `pickle` 使用的是二进制协议来存储数据,在反序列化过程中可能会触发恶意代码的执行。 #### 脆弱性分析 当程序接受来自不可信源的数据并尝试对其进行 unpickle 处理时,攻击者可以构造特制的 pickle 数据流,从而实现远程代码执行 (RCE)[^2]。这是因为 `pickle` 不仅恢复原始数据结构,还会调用类方法或函数完成重建过程中的某些逻辑运算。如果被反序列化的对象定义了特殊的方法(如 `__reduce__()` 或 `__setstate__()`) 并且该方法包含了危险的操作,则可能造成安全风险。 以下是利用此漏洞的一般原理说明: - 攻击者创建一个自定义类实例,其中包含恶意行为; - 将此类实例通过标准库中的 `pickle.dumps()` 方法转换成字符串形式; - 把这个经过编码后的 payload 发送给目标应用; - 当受害者运行 `pickle.loads(payload)` 时即会激活隐藏于内部的功能。 #### 实际案例演示 下面给出一段简单的例子展示如何滥用上述机制达到任意 shell 命令的目的: ```python import os import subprocess import _pickle as cPickle class RunBinSh(object): def __reduce__(self): return (subprocess.Popen, (['/bin/sh'],)) evil = RunBinSh() serialized = cPickle.dumps(evil) # 这里模拟接收外部输入的情况下的不安全性 deserialized = cPickle.loads(serialized) ``` 在这个脚本里面我们定义了一个名为 `RunBinSh` 的新类型,它的唯一目的是返回一对元组给内置函数 `__reduce__`, 此处指定要执行的动作就是启动一个新的交互式终端窗口(`/bin/sh`). 如果有人把这个序列化之后的内容传回来再解码出来的话就会打开shell. #### 防护措施建议 为了防止这类问题的发生,应该采取如下策略之一或多组合起来加以防范: - **避免直接处理不受信任方提交过来的对象**: 只有确知其来源可靠才可放心地运用pickling/un-pickling技术. - **采用更安全替代方案**, 如 JSON/XML/YAML 等纯文本格式来进行跨平台间通信; 它们虽然功能有限但相对稳定得多. - **验证接收到的信息合法性之前绝不应先做任何解析动作**.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值