Авторизуйтесь с Python, Phpmyadmin, проблема в «SELECT» - PullRequest
0 голосов
/ 15 декабря 2018
I've a problem in this SELECT:

Предпосылка:

Я сделал скрипт, который создает базу данных с «ключом», который является зашифрованным паролем -> код шифрования:

import base64
import os
from cryptography.hazmat.backends import  default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

password_provided = "password"  # input
password = password_provided.encode()   # Convert in type byte

salt = b'\xaes\xff\x80\xe2| (\xfcG\xbdk\xedxb9\x15n7'
kdf = PBKDF2HMAC(
    algorithm=hashes.SHA256(),
    length=32,
    salt=salt,
    iterations=100000,
    backend=default_backend()
)
key = base64.urlsafe_b64encode(kdf.derive(password)) #can only use kdf once
print(key)

Теперь я 'Я пытаюсь сделать AUTH с методом POST, я начинаю пытаться с помощью некоторого SELECT для «поиска» пароля для журнала и найти метод для сравнения строки, не зашифрованной с зашифрованной строкой для входа в систему, я пытаюсь:

mycursor = mydb.cursor()

sql = "SELECT password FROM users WHERE password = %s", (key) #Problem!

mycursor.execute(sql)

myresult = mycursor.fetchall()

for x in myresult:
  print(x)

Мой вывод:

**  File "login.py", line 12, in <module>
    mycursor.execute(sql)
  File "/Users/jhon/prova/lib/python3.7/site-packages/mysql/connector/cursor.py", line 536, in execute
    stmt = operation.encode(self._connection.python_charset)
AttributeError: 'tuple' object has no attribute 'encode'
**

Я пытаюсь сделать "key1 = key.encode ()", но это неправильно ... Спасибо всем.

1 Ответ

0 голосов
/ 15 декабря 2018

Эта строка создает 2-х кортеж строки и целое число и присваивает его переменной "sql":

sql = "ВЫБРАТЬ пароль от пользователей, ГДЕ пароль =% s", (ключ) #Problem!

"(ключ)" не создает 1-кортеж;чтобы сделать то, что вы хотите "(ключ,)".Похоже, вы хотели создать 2-кортеж строки, за которым следует 1-кортеж.

Затем эта строка отправляет 2-кортеж, который вы создали, в качестве единственного аргумента вызываемому методу:

mycursor.execute (sql)

Если это библиотека, которую вы используете, тогда строка документации для определения функции будет выполнена (см. Строку 183) здесь ...: https://github.com/mysql/mysql-connector-python/blob/master/lib/mysql/connector/cursor.py

... показывает, что вы хотите указать значения для заполнения шаблона запроса, используя n-кортеж в качестве второго аргумента функции .execute (...).Вы можете сделать это с помощью оператора аргумента variadic, известного как оператор последовательности-распаковки (упоминается как часть https://medium.com/understand-the-python/understanding-the-asterisk-of-python-8b9daaa4a558),, или вы можете отделить их. Поэтому вы можете захотеть код, подобный этому:

sql= "ВЫБРАТЬ пароль от пользователей, ГДЕ пароль =% s"

values ​​= (key,)

mycursor.execute (sql, values)

или

sql = "ВЫБЕРИТЕ пароль от пользователей, ГДЕ пароль =% s", (ключ,)

# оператор звезды внутри вызова функции распаковывает переменную последовательности на один уровень в отдельные аргументы.

mycursor.execute (* sql)

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