найти пароль, который соответствует имени пользователя в таблице sqlite - PullRequest
0 голосов
/ 02 мая 2019

Я управляю веб-сайтом, использующим микрофрейм Flask и sqlite3 для хранения пользовательских логинов. В настоящее время у меня возникают проблемы с сопоставлением имени пользователя и пароля, введенных пользователем из формы HTML, с существующими записями в моей базе данных.

Я использую расширение для входа в систему фляги, чтобы помочь мне с этим, и когда я пытаюсь сопоставить, я получаю сообщение об ошибке типа:

индексы списка должны быть целыми числами или ломтиками, а не str

вот мой код на python, который превращает таблицу SQLite в переменную:

con = sql.connect("table.db")
cur = con.cursor()
cur.execute('SELECT * FROM users')
names = cur.fetchall()

Затем у меня есть этот код, который берет пароль из формы HTML и пытается сопоставить его с паролем, связанным с именем пользователя в таблице

user_name = request.form['username']
if request.form['password'] == names[user_name]['password']:
        user = User()
        user.id = user_name
        flask_login.login_user(user)

вот что возвращает 'names':

[(7, 'ValidName', 'ValidTest', 'User@test.com'), (8, 'User2', 'password2', 'User@test2.com')]

Что должно произойти, так это то, что программа проверит ввод формы на «пароль» и сопоставит его с «паролем», связанным с именем пользователя. Так, например, если бы ValidName и ValidTest были введены в форму, они были бы запрошены программой и сопоставлены с записями, найденными в «именах».

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Вот виновный: names[user_name]['password']

names - это возвращаемое значение fetchall и, следовательно, простой список. Чтобы использовать его в вышеприведенном выражении, оно должно быть отображением отображений.

Вы должны построить это так:

names = {row[1]: {'id': row[0], 'password': row[2], 'mail': row[3]}
         for row in cur.fetchall()}

Но будьте осторожны: это загружает полную пользовательскую базу данных в память Это имеет смысл, только если у вас мало пользователей ...

0 голосов
/ 02 мая 2019

Я предполагаю, что вы не хэшировали свой пароль, что вам следует сделать.Без учета безопасности вот мой грязный подход

cur.execute('SELECT * FROM users WHERE name = %s AND password = %s', (request.form['username'], request.form['password']))
user = cur.fetchone()

Это может быть полезным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...