You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

密码验证逻辑存在误判,如何修正Python密码校验函数?

密码验证函数修正方案

先明确所有校验规则的正确逻辑:

  • 必须满足长度>6,且不包含任意大小写的"password"
  • 必须包含至少3种区分大小写的不同字母/数字(无论长度是否超过10)
  • 当长度≤9时,额外需要:至少1个数字,且不能全为数字
  • 当长度>9时,上述数字规则不适用

原代码的问题

  1. 未全局校验规则5:长度>9的分支直接返回True,忽略了“至少3种不同字符”的要求
  2. 第三个分支逻辑错误:set(password) > 2的判断脱离了长度和禁用词的校验,会导致比如长度≤6、或包含"password"的密码被误判为合法
  3. 第一个分支未校验规则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

逻辑说明

  1. 基础拦截:先过滤长度≤6或包含"password"的密码,减少后续判断复杂度
  2. 字符种类校验:用set(password)获取区分大小写的唯一字符,确保数量≥3,满足规则5
  3. 长度分支处理:仅当长度≤9时,才校验“含数字且不全为数字”的规则;长度>9时直接跳过该规则
  4. 所有条件满足则返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:04:56