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")

編集

これが機能するようになったので、読みやすくするために、アプリケーションを 3 つの関数に分割しようとしています。無限ループになることを除いて、動作します。

なぜ何か提案はありますか?

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に保存するためです。このローカル変数は、チェックしている場所を参照していません。statusstatus

while status != "q": 

つまり、変数status2 つの異なるスコープで使用しています(内側のスコープを変更しても、外側のスコープは変更されません)。

これを修正する方法はたくさんありますが、そのうちの 1 つが変更です。

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

そして、displayMenulike so の最後に return ステートメントを追加すると、

return status

これにより、スクリプトのstatusローカル スコープからグローバル スコープへの新しい値が保存され、ループが適切に機能するようになります。displayMenuwhile

別の方法は、この行を の先頭に追加することですdisplayMenu

global status

これは Python に、statuswithinが新しいローカル スコープの変数ではなくdisplayMenu、グローバル スコープの変数を参照することを伝えます。status

于 2013-04-06T02:44:37.317 に答える
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 に答える
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 に答える