6

我正在尝试使用字典构建一个简单的登录和密码应用程序。它工作正常,除了检查登录名是否与密码匹配的部分(在底部显示“登录成功!”)。

如果我要创建登录名'a'和密码'b',然后创建登录名'b'和密码'a',如果我尝试使用登录名'a'和密码'a'登录,它会登录我。它只是检查这些字符是否存在于字典中的某个地方,而不是它们是否是一对。

任何建议如何解决这个问题?

users = {}
status = ""

while status != "q":
    status = raw_input("Are you a registered user? y/n? Press q to quit: ")  

    if status == "n": #create new login
         createLogin = raw_input("Create login name: ")

         if createLogin in users: # check if login name exist in the dictionary
             print "Login name already exist!\n"
         else:
             createPassw = raw_input("Create password: ")
             users[createLogin] = createPassw # add login and password
             print("\nUser created!\n")     

    elif status == "y": #login the user
        login = raw_input("Enter login name: ")

        if login in users:
           passw = raw_input("Enter password: ")
           print

           if login in users and passw in users: # login matches password
               print "Login successful!\n"

        else:
            print
            print("User doesn't exist!\n")

编辑

现在这正在工作,为了便于阅读,我正在尝试将应用程序划分为三个功能。它有效,除了我得到无限循环。

任何建议为什么?

users = {}
status = ""

def displayMenu():
    status = raw_input("Are you a registered user? y/n? Press q to quit: ")  
    if status == "y":
        oldUser()
    elif status == "n":
        newUser()

def newUser():
    createLogin = raw_input("Create login name: ")

    if createLogin in users: # check if login name exists
        print "\nLogin name already exist!\n"
    else:
        createPassw = raw_input("Create password: ")
        users[createLogin] = createPassw # add login and password
        print("\nUser created!\n")     

def oldUser():
    login = raw_input("Enter login name: ")
    passw = raw_input("Enter password: ")

    # check if user exists and login matches password
    if login in users and users[login] == passw: 
        print "\nLogin successful!\n"
    else:
        print "\nUser doesn't exist or wrong password!\n"

while status != "q":            
    displayMenu()
4

5 回答 5

3

现在,您正在检查给定的密码 是否与(不正确)中的passw任何键匹配。users您需要查看输入的密码是否与该特定用户的密码匹配。由于您已经检查了用户名是否存在于字典的键中,因此您不必再次检查,因此请尝试以下操作:

if passw == users[login]:
    print "Login successful!\n"

编辑:

对于您更新的代码,我将假设“无限循环”意味着您不能用于q退出程序。这是因为当你在里面时,你将displayMenu用户输入保存在一个名为status. 此局部变量status您检查的地方不同,

while status != "q": 

换句话说,您status两个不同的范围内使用变量(更改内部范围不会更改外部范围)。

有很多方法可以解决这个问题,其中一种是改变,

while status != "q":
    status = displayMenu()

并在末尾添加一个 return 语句displayMenu

return status

通过这样做,您将新值status从本地范围保存displayMenu到脚本的全局范围,以便while循环可以正常工作。

另一种方法是将此行添加到displayMenu,

global status

这告诉 Python statuswithindisplayMenu指的是全局作用域status变量,而不是新的局部作用域变量。

于 2013-04-06T02:44:37.317 回答
1

改变

if login in users and passw in users: # login matches password

if users[login] == passw: # login matches password

此外,您不应该告诉黑客“用户不存在!”。更好的解决方案是说出一般原因,例如:“用户不存在或密码错误!”

于 2013-04-06T02:41:36.533 回答
0

如果你把它放到网上,请在数据库中加密你的密码。干得好。

import md5
import sys
# i already made an md5 hash of the password: PASSWORD
password = "319f4d26e3c536b5dd871bb2c52e3178" 
def checkPassword():
    for key in range(3):
        #get the key
        p = raw_input("Enter the password >>")
        #make an md5 object
        mdpass = md5.new(p)
        #hexdigest returns a string of the encrypted password
        if mdpass.hexdigest() == password:
            #password correct
            return True
        else:
            print 'wrong password, try again'
    print 'you have failed'
    return False

def main():
    if checkPassword():
        print "Your in"
        #continue to do stuff

    else:
        sys.exit()
if __name__ == '__main__':
    main()
于 2013-04-06T05:51:29.283 回答
0
usrname = raw_input('username   :     ')
if usrname == 'username' :
    print 'Now type password '

else :
    print 'please try another user name .this user name is incorrect'


pasword = raw_input ('password     :    ')
if pasword  == 'password' :
    print ' accesses granted '
    print ' accesses granted '
    print ' accesses granted '
    print ' accesses granted '
    print 'this service is temporarily unavailable'

else :
    print 'INTRUDER ALERT !!!!' , 'SYSTEM LOCKED'
    print 'INTRUDER ALERT !!!!' , 'SYSTEM LOCKED'
    print 'INTRUDER ALERT !!!!' , 'SYSTEM LOCKED'
    exit()
于 2014-04-30T07:12:20.337 回答
0

这是基于之前针对单个用户的一个非常简单的一个,具有改进的语法和错误修复:

print("Steam Security Software ©")
print("-------------------------")
print("<<<<<<<<<Welcome>>>>>>>>>")
username = input("Username:")
if username == "username" :
    print ("Now type password")

else :
    print ("please try another user name. This user name is incorrect")


password = input ("Password:")
if password  == "password" :
    print ("ACCESS  GRANTED")
    print ("<<Welcome Admin>>")
    #continue for thins like opening webpages or hidden files for access

else :
    print ("INTRUDER ALERT !!!!" , "SYSTEM LOCKED")
    exit()
于 2014-11-07T19:30:36.513 回答