Python航班管理系统登录bug:输入同组任意密码即可登录求助
问题原因
- 逻辑顺序错误:你先判断用户名存在就把
found设为1,后续密码校验如果触发异常,found的值不会被修改,直接保留为1,导致只要用户名存在就能登录。 - 密码校验逻辑错误:你使用
in判断密码,而不是==,in对于字符串来说是判断子串包含关系,哪怕输入密码的一部分也可能校验通过;同时你对三个分组字典都执行了get查询,当用户名只属于其中一个分组时,另外两个分组的get返回None,执行upwd in None会抛出TypeError,直接被你写的空except捕获,跳过了密码错误的赋值逻辑。 - 空的异常捕获块(裸except)隐藏了所有错误,你根本看不到密码校验过程中抛出的异常,无法定位问题。
修复方案
替换原有的login函数即可,修正后的代码如下:
def login(u): q=2 while q==2: warnings.filterwarnings("ignore") found=0 uid=u upwd=getpass.getpass(prompt="Enter the User Password : -\t") # 先判断用户所属分组,再做精准密码校验 if uid in admin: if upwd == admin[uid]: found=1 elif uid in manager: if upwd == manager[uid]: found=1 elif uid in standard: if upwd == standard[uid]: found=1 if found==0: time.sleep(1) print("\n... Entered User Name / Password is wrong ...") else: time.sleep(1) print("\n System Starting.... \a\a\a\a\a\a") break
修改说明
- 去掉了无用的裸except,避免隐藏运行异常
- 先判断用户所属的分组,仅拿对应分组的密码做相等校验,用
==替代in,避免子串匹配的问题 - 只有用户名存在且密码完全匹配的情况下才会把
found设为1,其余情况都为0,不会出现用户名存在就默认校验通过的问题
内容的提问来源于stack exchange,提问作者vivek ck
相关产品推荐
相关产品推荐

