я запутался с проверкой. Я пытался создать функцию входа в систему / реестр, и мне было трудно подтвердить данные для входа в мою базу данных

#python #python-3.7

#python #python-3.7

Вопрос:

Я пытаюсь создать функцию входа в систему / реестра с помощью tkinter на python, но запутался с проверкой через функцию входа. Он должен подключиться к базе данных и посмотреть, верны ли поля, но я не могу понять, как это сделать.

 def login_verify():
    global c

    with sqlite3.connect('database.db') as db:
        c = db.cursor()

    username1 = username_verify.get()
    password1 = password_verify.get()
    username_login_entry.delete(0, END)
    password_login_entry.delete(0, END)

    finduser = ('SELECT * FROM Users WHERE username =? AND password =?')
    c.execute(finduser,[(username1),(password1)])
    results = c.fetchall()
    if results:
        login_sucess()

    else:
        password_not_recognised()
        user_not_found()

def login_success():
    global login_success_screen
    login_success_screen = Toplevel(login_screen)
    login_success_screen.title("Success")
    login_success_screen.geometry("150x100")
    Label(login_success_screen, text="Login Success").pack()
    Button(login_success_screen, text="OK", command=delete_login_success).pack()

def password_not_recognised():
    global password_not_recog_screen
    password_not_recog_screen = Toplevel(login_screen)
    password_not_recog_screen.title("Success")
    password_not_recog_screen.geometry("150x100")
    Label(password_not_recog_screen, text="Invalid Password ").pack()
    Button(password_not_recog_screen, text="OK", command=delete_password_not_recognised).pack()


def user_not_found():
    global user_not_found_screen
    user_not_found_screen = Toplevel(login_screen)
    user_not_found_screen.title("Success")
    user_not_found_screen.geometry("150x100")
    Label(user_not_found_screen, text="User Not Found").pack()
    Button(user_not_found_screen, text="OK", command=delete_user_not_found_screen).pack()

  

при входе в систему с неправильным паролем следует запустить функцию ‘password_not_recognised’

при входе в систему с данными, отсутствующими в базе данных, он должен запускать ‘user_not_found’

и когда данные верны, он должен запустить login_success ()

Комментарии:

1. Ваш текущий запрос к БД не может отличить «пользователь не найден» и «пароль неверен» — оба результата возвращают нулевые строки. Вы могли бы либо выполнить два запроса (первый username отдельно), либо изменить запрос на SELECT password FROM Users WHERE username=? и сравнить возвращенный пароль самостоятельно. (Или просто оставьте все как есть, и получите комбинированное сообщение об ошибке, охватывающее оба случая — многие реальные логины работают таким образом, чтобы злоумышленники не проверяли действительные имена пользователей.)

Ответ №1:

Я бы предпочел дать вам возможность выполнить эту задачу самостоятельно, поэтому я расскажу об основных принципах:

  • Вы использовали подготовленные инструкции, которые великолепны и предотвращают атаки sql-инъекций при правильном использовании. Хотя вы никогда не должны хранить пароли открытым текстом в своей базе данных. Используйте hashlib модуль и сравните хэш пароля с хэшем пароля, который хранится в БД.
  • Поле имени пользователя должно быть уникальным первичным ключом, поэтому только одна строка в таблице должна содержать данное имя пользователя.

Необходимо внести два изменения в способ запроса к базе данных:

  1. Запрос sql не должен содержать поля имени пользователя и пароля в операторе where. Это связано с тем, что вы не можете определить, не удался ли запрос из-за того, что пользователь не существует или пароль не совпадает
  2. Используйте курсор.fetchone для извлечения строки пользователя и сохранения ее в переменной. Если это не None, пользователь существует и перейдите к проверке пароля.