鱼C论坛

 找回密码
 立即注册
查看: 741|回复: 4

[已解决]课后习题一个问题:密码强度检测答案中有漏洞,但是初学者不知道怎么解决,望指正@

[复制链接]
发表于 2018-11-16 14:14:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
# 密码安全性检测代码
#
# 低级密码要求 :
#   1.密码由单纯的数字或字母组成
#   2.密码长度小于等于8位
#
# 中级密码要求 :
#   1.密码必须由数字、字母或特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)任意两种组合
#   2.密码长度大于8位小于16位
#
# 高级密码要求:
#   1. 密码必须由数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种组合
#   2. 密码只能由字母开头
#   3. 密码长度不能低于16位

symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'

passwd = input('请输入需要检查的密码组合:')

# 判断长度

length = len(passwd)
while(passwd.isspace() or length == 0):
    passwd = input('您输入的密码为空(或空格),请重新输入:')
if length <= 8:
    flag_len = 1
elif 8 < length < 16 :
    flag_len = 2
else :
    flag_len = 3

flag_con = 0

# 判断是否包含特殊字符

for each in passwd :
    if each in symbols:
        flag_con += 1
        break

# 判断是否包含字母

for each in passwd :
    if each in chars :
        flag_con += 1
        break

# 判断是否包含数字

for each in passwd :
    if each in nums:
        flag_con += 1
        break

# 打印结果

while 1 :
    print('您的密码安全级别评定为:',end = '')
    if flag_len == 1 or flag_con == 1:
        print('低')
    elif flag_len == 2 or flag_con == 2:
        print('中')
    else :
        print('高')
        print('请保持继续')
        break

    print("请按以下方式提升您的密码安全级别:\n\
    \t1. 密码必须由数字、字母及特殊字符三种组合\n\
    \t2. 密码只能由字母开头\n\
    \t3. 密码长度不能低于16位'")
    break


代码如上,但是高级密码必须首字母开头,然而代码中并没有检测首字符是否为字母,会造成如果首字母不是字母满足其他条件也是高级密码的BUG!

不会使用 startwith() ,望指教一下,而且打印结果也不知道怎么修改,
最佳答案
2018-11-16 15:57:01
直接判断 if passwd[0] in chars,再加上其他条件判断为高级,否则往下走
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-11-16 15:57:01 | 显示全部楼层    本楼为最佳答案   
直接判断 if passwd[0] in chars,再加上其他条件判断为高级,否则往下走
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-16 16:52:55 | 显示全部楼层
Krant5 发表于 2018-11-16 15:57
直接判断 if passwd[0] in chars,再加上其他条件判断为高级,否则往下走

是先判断是否为高级,不是再运行着其他两种判定?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-16 17:01:25 | 显示全部楼层
修炼代码 发表于 2018-11-16 16:52
是先判断是否为高级,不是再运行着其他两种判定?

临时改法,你看看
  1. # 密码安全性检测代码
  2. #
  3. # 低级密码要求 :
  4. #   1.密码由单纯的数字或字母组成
  5. #   2.密码长度小于等于8位
  6. #
  7. # 中级密码要求 :
  8. #   1.密码必须由数字、字母或特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)任意两种组合
  9. #   2.密码长度大于8位小于16位
  10. #
  11. # 高级密码要求:
  12. #   1. 密码必须由数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种组合
  13. #   2. 密码只能由字母开头
  14. #   3. 密码长度不能低于16位

  15. symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
  16. chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
  17. nums = '0123456789'

  18. passwd = input('请输入需要检查的密码组合:')

  19. # 判断长度

  20. length = len(passwd)
  21. while(passwd.isspace() or length == 0):
  22.     passwd = input('您输入的密码为空(或空格),请重新输入:')
  23. if length <= 8:
  24.     flag_len = 1
  25. elif 8 < length < 16 :
  26.     flag_len = 2
  27. else :
  28.     flag_len = 3

  29. flag_con = 0

  30. # 判断是否包含特殊字符

  31. for each in passwd :
  32.     if each in symbols:
  33.         flag_con += 1
  34.         break

  35. # 判断是否包含字母

  36. for each in passwd :
  37.     if each in chars :
  38.         flag_con += 1
  39.         break

  40. # 判断是否包含数字

  41. for each in passwd :
  42.     if each in nums:
  43.         flag_con += 1
  44.         break

  45. # 打印结果

  46. while 1 :
  47.     print('您的密码安全级别评定为:',end = '')
  48.     if flag_len == 1 or flag_con == 1:
  49.         print('低')
  50.     elif flag_len == 2 or flag_con == 2:
  51.         print('中')
  52.     else :
  53.         if passwd[0] in chars:
  54.             print('高')
  55.             print('请保持继续')
  56.         else:
  57.             print('中')
  58.         break
  59.     # print('您的密码安全级别评定为:',end = '')
  60.     # if flag_len == 1 or flag_con == 1:
  61.     #     print('低')
  62.     # elif flag_len == 2 or flag_con == 2:
  63.     #     print('中')
  64.     # else :
  65.     #     print('高')
  66.     #     print('请保持继续')
  67.     #     break

  68.     print("请按以下方式提升您的密码安全级别:\n\
  69.     \t1. 密码必须由数字、字母及特殊字符三种组合\n\
  70.     \t2. 密码只能由字母开头\n\
  71.     \t3. 密码长度不能低于16位'")
  72.     break
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-16 17:05:44 | 显示全部楼层
Krant5 发表于 2018-11-16 17:01
临时改法,你看看

thanks,得到启发了!感谢感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-13 23:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表