将数据存入模块级列表,调用Sign_in返回invalid而非success如何解决
问题原因
- 邮箱大小写不匹配:注册时对输入的邮箱调用了
capitalize()方法,会将首字母转为大写、其余字母转为小写,但登录时输入的邮箱仅做了strip()处理,没有做相同的大小写转换,导致字符串匹配失败。 - 密码类型&格式不匹配:
- 注册时密码输入后经过
capitalize()处理,以字符串类型存入lists_module.passwords列表,但登录时把输入的密码强制转为了int类型,类型不一致无法匹配 - 如果密码本身包含非数字字符,转
int操作还会直接抛出类型错误
- 注册时密码输入后经过
- 校验逻辑存在漏洞:原有逻辑仅判断邮箱和密码分别存在于两个独立列表中,没有绑定两者的对应关系,只要任意已注册邮箱和任意已注册密码组合都能校验通过,存在安全问题。
修复方案
基础修复(仅解决登录失败问题)
将登录函数中的邮箱、密码处理逻辑和注册侧保持一致,同时删除密码转int的操作:
import lists_module def Sign_in(): # 邮箱处理逻辑和注册侧对齐,增加capitalize() email = input("Enter Your Email").strip().capitalize() # 密码处理逻辑和注册侧对齐,增加capitalize(),删除int转换 password = input("Enter your password").strip().capitalize() if email in lists_module.emails and password in lists_module.passwords: print("success") else: print("invalid") def Sign_up(): first_name = input("Enter Your First Name").strip().capitalize() last_name = input("Enter Your Last Name").strip().capitalize() new_email = input("Enter Your Email").strip().capitalize() # 修正原代码的输入提示拼写错误Enetr→Enter new_password = input("Enter New Password").strip().capitalize() lists_module.Fname.append(first_name) lists_module.Lname.append(last_name) lists_module.emails.append(new_email) lists_module.passwords.append(new_password) print("Sign-In Page") Sign_in()
优化方案(修复校验逻辑漏洞)
如果需要实现邮箱和密码的绑定校验,避免跨账号匹配,可以修改校验逻辑如下:
import lists_module def Sign_in(): email = input("Enter Your Email").strip().capitalize() password = input("Enter your password").strip().capitalize() try: # 查找邮箱对应的索引,校验同索引下的密码是否匹配 email_index = lists_module.emails.index(email) if lists_module.passwords[email_index] == password: print("success") else: print("invalid") except ValueError: # 邮箱不存在直接返回校验失败 print("invalid") def Sign_up(): first_name = input("Enter Your First Name").strip().capitalize() last_name = input("Enter Your Last Name").strip().capitalize() new_email = input("Enter Your Email").strip().capitalize() # 新增邮箱重复校验,避免同一个邮箱注册多个账号 if new_email in lists_module.emails: print("This email has been registered") return new_password = input("Enter New Password").strip().capitalize() lists_module.Fname.append(first_name) lists_module.Lname.append(last_name) lists_module.emails.append(new_email) lists_module.passwords.append(new_password) print("Sign-In Page") Sign_in()
额外提示:如果不需要强制统一邮箱、密码的大小写,也可以同时删除注册和登录逻辑里的
capitalize()调用,完全按照用户输入的原始内容做匹配。
内容的提问来源于stack exchange,提问作者Fady Esam
相关产品推荐
相关产品推荐

