Python如何正确实现OTP验证?新手用random库做文件权限验证遇死循环求助
OTP验证程序无限循环问题修复
现有代码的核心逻辑问题
- 变量复用混乱:系统生成的OTP存在
OTP变量里,后续你直接用用户输入值、固定字符串反复覆盖这个变量,从头到尾没有做「用户输入值」和「系统生成OTP」的实际比对。 - 重复无效输入:连续写了两次OTP输入逻辑,第一次输入的内容存在
Password变量里全程没有被调用,平白让用户多输入一次。 - 比对逻辑错误:你把变量
new_otp赋值成了固定字符串"OTP",后续循环判断时又把字符串字面值"new_otp"当成比对对象,完全和之前的变量值对不上。 - 循环结构失效:循环体里没有重新获取用户输入的逻辑,一旦进入循环状态,既不能拿到新的输入做校验,也无法满足跳出条件。
- 输出逻辑错位:循环体最开头直接打印欢迎语,不管后续校验是否通过,提前输出不符合流程的提示内容。
- 依赖缺失:代码中使用了
random、string模块,没有提前导入,运行初始就会触发名称错误。
触发无限循环的直接原因
你执行完OTP = new_otp后,判断条件写的是OTP != "new_otp"。这里加了引号的"new_otp"是固定字符串,不是存储正确值的变量,此时OTP的值是之前赋值的字符串"OTP",和固定字符串"new_otp"永远不相等,循环条件会永久成立,程序就会卡在循环里反复打印内容,不会自动退出。
修复后的可运行代码
import random import string def rand_pass(size): char_pool = string.ascii_uppercase + string.ascii_lowercase + string.digits return ''.join([random.choice(char_pool) for _ in range(size)]) # 系统生成10位OTP(实际生产环境该值会通过短信/邮件推送,不会直接在控制台打印) system_generated_otp = rand_pass(10) print(f'本次验证OTP:{system_generated_otp}') # 获取用户输入完成校验 user_entered_otp = input('请输入OTP完成登录验证:') if user_entered_otp == system_generated_otp: print('验证通过,已开放文件访问权限') # 在此处补充文件读取/访问的业务逻辑 else: print('ACCESS DENIED. OTP不匹配,已拒绝访问')
如果需要支持用户多次重试输入的逻辑,可以把校验部分改成带输入的循环,避免空转:
# 支持最多3次重试的版本示例 max_retry = 3 for attempt in range(max_retry): user_entered_otp = input('请输入OTP完成登录验证:') if user_entered_otp == system_generated_otp: print('验证通过,已开放文件访问权限') break else: remain_times = max_retry - attempt -1 print(f'ACCESS DENIED. 剩余重试次数{remain_times}') else: print('重试次数耗尽,已锁定访问请求')
内容的提问来源于stack exchange,提问作者GhostwhiteActualCompilers
相关产品推荐
相关产品推荐

