Member 11271238 Ответов: 2

Моя ошибка кода Python с mysql select пожалуйста помогите мне


#=========login================
def loginCheck(self):
    Username = self.txt_name.text()
    Password = self.txt_Password.text()

    mydb = mysql.connector.connect( host="localhost",  user="root",  passwd="",  database ="mydatabase")
    mydb = mydb.cursor()
    mydb.execute("select * from tbl_name where name ='"Username"' && password = '"Password"'")

    if(len(myresult = mydb.fetchone()) > 0):
        print("user found !")
    else:
        print("User Not found !")


Что я уже пробовал:

<pre>  File "d:\from\fromlogin.py", line 20
    mydb.execute("select * from tbl_name where name = '"Username"' && password = '"Password"';")
                                                               ^
SyntaxError: invalid syntax

сообщение это
я стараюсь, но это все равно так ошибка, как это

2 Ответов

Рейтинг:
16

Richard MacCutchan

Вам нужно использовать + знак для объединения литеральных строк со значениями переменных:

mydb.execute("select * from tbl_name where name = '" + Username + "' && password = '" + Password + "';")

Однако вы никогда не должны хранить пароли в открытом тексте, это делает вашу систему уязвимой для хакеров. Используйте хэш-метод для преобразования пароля в соленый хэш (Google it) для более безопасной системы.


Рейтинг:
10

OriginalGriff

В дополнение к тому, что сказал Ричард, никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

А с вашим текущим кодом я могу полностью обойти проверку вашего пароля, добавив "'--" в конец любого имени пользователя ...

Смотрите здесь некоторые сведения о том, как хэшировать пароли: Хранение паролей: как это сделать.[^]

И помните: если это веб-сайт и у вас есть какие-либо пользователи из Европейского союза, то применяется GDPR, а это означает, что вы должны обрабатывать пароли как конфиденциальные данные и хранить их безопасным и безопасным способом. Текст-это ни то, ни другое, и штрафы могут быть ... ГМ ... выдающийся. В декабре 2018 года немецкая компания получила относительно низкий штраф в размере 20 000 евро именно за это.


Richard MacCutchan

Я бы упомянул об этом, но я не знаю, как сделать SQL с параметрами в Python. Мой список вещей, которым нужно учиться, становится длиннее, а не короче. :(

OriginalGriff

Google знает:
https://pynative.com/python-mysql-execute-parameterized-query-using-prepared-statement/

Richard MacCutchan

Также в W3Schools, который является одним из моих goto.