1. 参照モデル。この課題では、Linux ログイン認証プロセスを参照し、オンライン バンキング、Alipay、およびその他のロック ルールと組み合わせました。
1) 認証プロセスは Linux ログインを参照します。ユーザーの入力が完了したとき パスワードを渡した後、ユーザー名が存在するかどうか、ユーザーがロックされているかどうかを確認し、パスワードが正しいかどうかを確認します。検証が失敗した場合は、検証が失敗したことだけが表示されます。ユーザー名またはパスワードが間違っているかどうかを通知します。これにより、ブルートフォースクラッキングの可能性が高まります。
2) 間違った入力の数のカウントとロックについては、銀行とAlipayの慣行を参照します。つまり、彼らは、あなたが 間違って入力した回数 だけを気にしており、正しいものを 回入力した回数は気にしません。つまり、2 回間違って入力し、3 回目に間違って入力した場合、前回の 回数はクリアされていません、つまり、今日 1,000 回入力し、997 回間違って入力しましたが、間違って入力したのは 3 回だけなので、申し訳ありませんが、まだロックする必要があります。また、3 つの誤った入力が連続している必要はありません。 3回間違えて入力するとロックされてしまいます。
2.カウントとステータスの保存については、誤った入力数の累積とロックがファイルに保存されることを検討しますが、それでもファイル操作は増加します。プログラムの信頼性が確保されているため、プログラムが終了してもカウントは引き続き有効です。ファイルの種類は次のとおりです。 alex sb lock 3
Tom 666 lock unlock 0 geng 888 lock unlock 2
最初の列はユーザー名、2 番目の列はパスワード、3 番目の列はユーザーのステータス (lock はロックを表し、unlock はロックなしを意味します)、4 番目の列はログイン数です (実際、ログイン数はエラーがある場合に 1 つだけ増加する必要があり、エラーがある場合は無視されます)エラーはありません)。
コードは次のとおりです:
with open(filename,) key,values lines = print( f.write( .join(lines) + values.insert( f.write( .join(values) + # messages = {:[,,],:[,,],:[,, # write_file(messages, __name__ == active = username = input( users_dict = {} #用户字典,用于存放用户的信息,键-用户名,值- with open(,) lines = line user_list = users_dict[user_list[]] = user_list[ username users_dict[username][] == print( (users_dict[username][]) < user_pwd = input( users_dict[username][] == print( (users_dict[username][]) != print( % ( - (users_dict[username][ users_dict[username][] = (users_dict[username][]) + print( users_dict[username][] = users_dict[username][] = write_file(users_dict, elif username == print()
运行结果如下:
请输入你的用户名(输入quit退出):tom
请输入密码:22
还有2次机会,用户将被锁定!
请输入密码:22
还有1次机会,用户将被锁定!
请输入密码:22
对不起,您输入的次数过多,你的用户名已经被锁定,请联系管理员!
请输入你的用户名(输入quit退出):alex
您输入的用户名已经锁定,请联系管理员!
コードの説明:
1. ここでは、辞書と関数という 2 つのコンテンツが使用されます。辞書にユーザー情報を保存する目的は、ユーザー名が存在するかどうかを判断することです。をそのまま辞書のキーとして使用し、それ以外の情報を辞書の値として使用し、キーと1対1に対応させることで、ユーザー名が存在するかどうかを判断する際には、inを使用するだけで済みます。メンバー演算子が判断します。
2. コードの 61 行目と 62 行目で、ファイルを辞書に変換するプロセスが完了します。
オリジナルの Zhang Xiaoyu コード例:
#!/usr/bin/env python3
# coding:utf-8'''Created on: 2015年12月29日
@author: 张晓宇
Email: 61411916@qq.com
Version: 1.0Description: 输入用户名密码,认证成功显示欢迎信息,认证失败,输错三次后锁定
Help:'''import os
# 定义用户信息写入函数,用于把用户信息写回文件
def write_to_account_file(accounts,account_file_path):"""accounts是一个用户信息字典,目的是把变更过的信息写入文件中"""account_file = open(account_file_path,"w")for key,val in accounts.items():
line = []
line.append(key)
line.extend(val)
print(" ".join(line)) #字符串与列表拼接,目的是实现列表中每个元素加空格生成一个字符串如a b c d格式
account_file.write(" ".join(line) + "\n") #往文件中添加信息
account_file.close() #直接打开文件的时候一定要记得关闭文件,以免文件休息丢失if __name__ == '__main__':''' @parameters:
account_file_path:账户文件
password_col_num:账户文件中密码所在的列(从0开始)
status_col_num:账户文件中账户状态所在的列(从0开始)
error_count_num:账户文件中输入错误次数所在的列(从0开始)
app_info:系统信息,用户启动应用后的输出
welcome_msg:用户成功登录后的信息''' account_file_path = 'account.db'password_col_num = 1status_col_num = 2error_count_num = 3app_info = ''' +---------------------------------+
| Welcome to gcx system |
| Version:2.0 |
| Author:zhuzhu |
+---------------------------------+''' welcome_msg = "Welcome %s,authentication is successful!"if os.path.exists(account_file_path): #os.path.exists()判断文件是否存在,返回布尔值
# 判断账户文件是否存在
account_file = open(account_file_path,"r")else:
#文件不存在,看系统是否有误
print("Error:Account file 'account.db' is not exit,please check!")
exit(1)
#读账户文件
accounts = {}for line in account_file.readlines(): #按行读取文件
account = line.strip().split() #清楚空格后进行分列,生成一个列表
accounts[account[0]] = account[1:]"""把列表中的第一个元素(用户名)当做键,用户的其他信息当做值,组成键值对存放在字典中""""""account[0]键,account[1:]是值"""account_file.close() #关闭文件
flag = Truewhile flag:
print(app_info)
#输入用户名
username = input("Username(Enter quit to exit): ").strip()
#判断用户是否输入的为quitif username == "quit":
#是则退出循环,程序结束breakpassword = input("Password: ").strip()
#判断用户名是否存在if username not in accounts.keys():
#不存在提示错误信息并退出当前循环让用户重新输入
print("Error:Username or Password it is error!")continue #结束本次循环,让用户再次输入用户名和密码,继续执行下一次循环if accounts[username][status_col_num - 1] == "lock":
#如果被锁定退出当前循环让用户重新输入
print("Error:Account is locked.Please contact the administrator!")continue #跳过本次循环,让用户重新输入进行验证,这个可以避免很多缩进,能够继续执行下一次
#判断用户密码是否正确if password == accounts[username][password_col_num - 1]:
#正确显示欢迎信息
print(welcome_msg %username)breakelse:
#用户密码不正确的情况
#提示用户名或密码错误
print("Error:Username or Password it is error!")
#输入错误次数加1
accounts[username][error_count_num - 1] = str(int(accounts[username][error_count_num - 1]) + 1)
#判断是否已经达3次if int(accounts[username][error_count_num - 1 ]) == 3:
#如果输入错误达到3次
#提示账户将被锁定
print("Error: This account will be locked,Please contact the administrator!System will be exit!")
#将用户状态改为lock并写入文件
accounts[username][status_col_num - 1] == "lock"write_to_account_file(accounts,account_file_path)breakwrite_to_account_file(accounts,account_file_path)
上記のコードのハイライト:
(1) continue: このループを終了すると、ユーザーに再度入力させるという目的を達成するために continue の後のコードは実行されません。多くの Web ページでは、ユーザーが入力を続けることができます。ユーザーが [登録] を選択するか、Web ページを閉じるまで
(2) ドキュメントは比較的よく標準化されており、説明が含まれています
(3) ファイルは 1 行ずつ読み込まれ、ファイルを 1 行ずつ編集します。
(4) " ".join(list) を使用して新しい文字列を生成します。 ) 文字列の分割; extend() リスト間の結合。
以上がログインウィンドウを作成するための具体的な手順の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。