密码验证逻辑存在误判,如何修正Python密码校验函数?
密码验证函数修正方案
先明确所有校验规则的正确逻辑:
- 必须满足长度>6,且不包含任意大小写的"password"
- 必须包含至少3种区分大小写的不同字母/数字(无论长度是否超过10)
- 当长度≤9时,额外需要:至少1个数字,且不能全为数字
- 当长度>9时,上述数字规则不适用
原代码的问题
- 未全局校验规则5:长度>9的分支直接返回
True,忽略了“至少3种不同字符”的要求 - 第三个分支逻辑错误:
set(password) > 2的判断脱离了长度和禁用词的校验,会导致比如长度≤6、或包含"password"的密码被误判为合法 - 第一个分支未校验规则5:长度在7-9之间的密码即使满足数字/字母要求,若字符种类不足3种也应该被拒绝
修正后的代码
def is_acceptable_password(password: str) -> bool: # 基础校验:长度不达标或包含禁用词直接拒绝 if len(password) <= 6 or 'password' in password.lower(): return False # 规则5:统计区分大小写的不同字符数量 unique_chars = set(password) if len(unique_chars) < 3: return False # 长度≤9时,校验数字规则 if len(password) <= 9: has_digit = any(c.isdigit() for c in password) all_digit = password.isdigit() if not has_digit or all_digit: return False # 所有校验通过 return True
逻辑说明
- 基础拦截:先过滤长度≤6或包含"password"的密码,减少后续判断复杂度
- 字符种类校验:用
set(password)获取区分大小写的唯一字符,确保数量≥3,满足规则5 - 长度分支处理:仅当长度≤9时,才校验“含数字且不全为数字”的规则;长度>9时直接跳过该规则
- 所有条件满足则返回True,否则在对应分支返回False
测试用例验证
- 合法示例:"Passw0rd1"(长度8,含数字和字母,字符种类≥3,无禁用词)→ 返回True
- 合法示例:"abcdefghij"(长度10,无数字,字符种类≥3,无禁用词)→ 返回True
- 非法示例:"aaaaaaa"(长度7,字符种类仅1种)→ 返回False
- 非法示例:"1234567"(长度7,全为数字)→ 返回False
- 非法示例:"Password1234"(含禁用词)→ 返回False
- 非法示例:"AAABBBCCC"(长度9,字符种类仅2种)→ 返回False
内容的提问来源于stack exchange,提问作者CodeNovice
相关产品推荐
相关产品推荐

