实现功能:

  1、用户输入账户密码

  2、验证账户是否存在于黑名单,如果存在于黑名单,则执行1,否则往下执行

  3、验证用户名和密码。

    3.1、如果验证成功,则打印欢迎信息并退出程序;

    3.2、如果用户名存在,但是密码错误,则记录这个账户的错误次数(当前会话有效)

      3.2.1、如果错误次数等于等于3,则将这个用户写入锁定文件保存

  4、当错误次数(用户名存在但是密码错误 + 用户名不存在)大于等于3时,sleep(5),然后重置错误次数

  1. #!/usr/bin/env python3
  2. __author__ = 'DSOWASP'
  3. import getpass
  4. import time
  5. error_count = 0             #认证错误次数,包括用户名错误和用户名正确但是密码错误
  6. error_users = []            #用于存放用户名存在,但是密码错误的列表,存放数据格式如:
  7. # [{'name':'ds','count':1},{'name':owasp','count':2}],当某个用户的count为3时,就把这个
  8. # 用户加到locklist.txt文件中, 由于error_users保存在内存中,因此只有在当前会话有效
  9. flag1 = 0    #0表示用户名不存在,1表示用户名密码正确,2表示用户名正确,但是密码错误
  10. flag2 = 0    #0表示当前用户不存在与error_users中,1当前用户存在于error_users中或error为非空
  11. while True:
  12. username = input("用户名:").strip()
  13. password = input("密码:").strip()
  14. if username == "EXIT":                 #为了能正确退出程序而设置的
  15. break
  16. flag1 = 0
  17. with open('locklist.txt','r') as f_lock:   #验证此用户是否被锁定
  18. u1 = f_lock.read().split("\n")
  19. if u1.count(username) != 0:
  20. print("此账户已被锁定!请选择其他账户登录")
  21. time.sleep(1)
  22. continue
  23. with open('userlist.txt','r') as f_user:         #验证用户名和密码
  24. for line in f_user:
  25. user = line.split()[0]
  26. passwd = line.split()[1]
  27. if username == user:
  28. if password == passwd:                  #用户和密码都正确,设置flag=1
  29. print("Welcome to My Python Page!!!")
  30. flag1 = 1
  31. break
  32. elif flag2 == 1:                       #密码不对,且当前error_users为非空
  33. flag1 = 2                           #用户名正确,但是密码不对
  34. for i in error_users:              #判断这个用户是否已存在于error_users中
  35. # print("循环字典1",error_users)
  36. if username == i.get("name"): #在error_users中找到了这个账户
  37. # print("找到字典元素:",username,error_users)
  38. flag2 = 1                  #当前用户存在于error_users中
  39. i["count"] = i.get("count") + 1          #置当前用户的密码错误次数加1
  40. if i.get("count") >= 3:                   #如果错误次数等于3
  41. with open('locklist.txt','a') as f_lock:         #就锁定这个账户
  42. f_lock.write("\n%s" % username)
  43. print("输入错误次数过多,%s账户已被锁定!请联系管理员!" %(username))
  44. else:                     #如果错误次数小于3,则打印提示信息
  45. print("用户%s已输入错误密码%d次,此账户还剩%d次尝试机会" % (i.get("name") , i.get("count"),3 - i.get("count")))
  46. break                     #如果再error_users中找到了当前的用户,则退出error_users的循环
  47. else:                         #如果在error_users中没找到这个用户,则打印提示信息,并设置flag2=0
  48. flag2 = 0
  49. if flag2 == 0:                        #添加当前用户到error_users中。
  50. flag1 = 2                         #用户名和密码都不正确
  51. print("添加前字典情况",error_users)
  52. error_users.append({'name':username,'count':1})
  53. print("用户%s已输入错误密码1次,此账户还剩2次尝试机会" % (username))
  54. print("添加%s用户到字典"%username)
  55. print(error_users)
  56. flag2 = 1                        #设置flag2=1表示error_users为非空
  57. if flag1 == 1:                                   #flag1=1表示用户名密码正确,则退出
  58. break
  59. elif flag1 == 0:                                 #flag=0表示用户名不存在斌,error_count加1
  60. error_count += 1
  61. print("用户名不存在,请重新输入,还剩%d次尝试机会" %(3 - error_count))
  62. elif flag1 == 2:                                 #flag1=2表示用户名正确但是密码错误.error_count 加1
  63. error_count += 1
  64. if error_count >= 3:                             #如果输错的此时大于等于3则打印提示信息,并sleep5秒,重置error_count
  65. print("输入错误次数超过3次,请5秒后重新输入")
  66. error_count = 0
  67. time.sleep(5)

python实例1:创建一个登陆模块的更多相关文章

  1. 如何创建一个 Lua 模块

    如何创建一个 Lua 模块 翻译自: How to Create a Lua Module 译者: FreeBlues 正文 Lua编程语言 中的一个 模块(module)是一个包含函数和变量的代码片 ...

  2. ASP.NET Core模块化前后端分离快速开发框架介绍之2、快速创建一个业务模块

    源码地址 GitHub:https://github.com/iamoldli/NetModular 演示地址 地址:https://nm.iamoldli.com 账户:admin 密码:admin ...

  3. python+mysql+flask创建一个微博应用(持续更新)

    微博应用的结构: 用户管理,包括登录管理,会话,用户角色,个人档案及用户头像. 数据库管理,包括数据库迁移处理. Web表单支持,包括字段检验和用于防止垃圾邮件的验证码功能. 大数据的分页功能. 全文 ...

  4. Docker实例:创建一个点到点连接

    默认情况下,Docker 会将所有容器连接到由 docker0 提供的虚拟子网中. 用户有时候需要两个容器之间可以直连通信,而不用通过主机网桥进行桥接. 解决办法很简单:创建一对 peer 接口,分别 ...

  5. python使用__new__创建一个单例模式(单例对象)

    #单例模式:使一个类只产生一个对象.他们的id地址都指向同一个内存地址 第一步:理解谁创建了对象 # 单例模式# 首先明白,我们在创建一个类的对象的时候,其实是调用的这个类的父类,即继承object, ...

  6. python web编程 创建一个web服务器

    这里就介绍几个底层的用于创建web服务器的模块,其中最为主要的就是BaseHTTPServer,很多框架和web服务器就是在他们的基础上创建的 基础知识 要建立一个Web 服务,一个基本的服务器和一个 ...

  7. 用Python+qrcode库创建一个包含信息的二维码

    安装qrcode库和PIL库 在命令行中分别输入pip install qrcode 和pip install pillow 导入库格式如下: import PIL import qrcode 下面以 ...

  8. python使用wxPython创建一个简单的文本编辑器。

    ubuntu下通过'sudo apt-get install python-wxtools'下载wxPython.load和save函数用于加载和保存文件内容,button通过Bind函数绑定这两个函 ...

  9. Python学习—基础篇之常用模块

    常用模块 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要 ...

随机推荐

  1. 使用file_get_contents下载图片

        <?php /* 当你在搭建网站时,从远程服务器下载某张图片并且将其保存在自己的服务器上,这一操作会经常用到.代码如下: */ $image = file_get_contents('h ...

  2. JavaScript target与currentTarget区别

    1.DOM事件绑定到父元素 <!DOCTYPE html> <html lang="zh"> <head> <meta charset=& ...

  3. jQuery异步框架探究2:jQuery.Deferred方法

    (本文针对jQuery1.6.1版本号)关于Deferred函数的描写叙述中有一个词是fledged,意为"羽翼丰满的",说明jQuery.Deferred函数应用应该更成熟. 这 ...

  4. MATLAB 2014a 在Mac os x yosemite 10.10 Retina显示模糊的解决的方法

    恐怕非常多童鞋在升级了yosemite之后都遇到了Matlab的问题. 之前转载的一篇文章写了安装的方法,本文说一下解决Retina屏显示模糊的办法. 那么因为Matlab 2014a使用自带的jav ...

  5. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

  6. atitit.bsh BeanShell 的动态脚本使用java

    atitit.bsh BeanShell 的动态脚本使用java 1.1. BeanShell是一个小巧免费的JAVA源码解释器 ,支持对象式的脚本语言特性,亦可嵌入到JAVA源代码中. 亦可嵌入到J ...

  7. Junit 内部解密之二: TestResult + TestListener + Assert

    转自:http://blog.sina.com.cn/s/blog_6cf812be0100wbhw.html 之前我们看到了Test接口里面的run方法有个TestResult的参数,不错,这个类就 ...

  8. Debian NAT共享上网

    如果Linux主机有两个网卡,比如一个有线.一个无线,当无线连接后,其他机器即可通过有线共享上网,为了方便叙述,假设环境如下: A机器有两块网卡,eth0和ws0,其中ws0为无线网卡,已连接wifi ...

  9. php序列化与反序列化

    php序列化简单来说就是 把复杂的数据类型压缩到一个字符串中php对象转换成字符串,反序列化就是把变量转换成对象 一般来说  当把这些序列化的数据放在URL中在页面之间会传递时,需要对这些数据调用ur ...

  10. Netty实战

    一.Netty异步和事件驱动1.Java网络编程回顾socket.accept 阻塞socket.setsockopt /非阻塞2.NIO异步非阻塞a).nio 非阻塞的关键时使用选择器(java.n ...