#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
модуль и сравните хэш пароля с хэшем пароля, который хранится в БД. - Поле имени пользователя должно быть уникальным первичным ключом, поэтому только одна строка в таблице должна содержать данное имя пользователя.
Необходимо внести два изменения в способ запроса к базе данных:
- Запрос sql не должен содержать поля имени пользователя и пароля в операторе where. Это связано с тем, что вы не можете определить, не удался ли запрос из-за того, что пользователь не существует или пароль не совпадает
- Используйте курсор.fetchone для извлечения строки пользователя и сохранения ее в переменной. Если это не None, пользователь существует и перейдите к проверке пароля.