Datenvergleich mit Datenbank funktioniert nicht

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
celamo
User
Beiträge: 1
Registriert: Dienstag 25. Januar 2022, 17:45

Hallo,
ich möchte ein eingegebenes Passwort und den Benutzernamen mit meiner Datenbank abgleichen. Die Abfrage der Datenbank an sich funktioniert, doch egal ob das Passwort richtig ist oder nicht, wird mir immer ausgegeben, dass es nicht ist. Dabei ist der Benutzername immer eine Zahl, auch in der Datenbank so angegeben, und das Passwort eine Kombination aus Groß- und Kleinbuchstaben, sowie Sonderzeichen.

Mein Code (etwas abgeändert):

Code: Alles auswählen

username = input("Username:")
int(username)
password = input("Password:")
cursor.execute("SELECT banwender.Passwort FROM banwender where banwender.ALoginID=" + username)
richtigesPasswort = cursor.fetchall()
print(richtigesPasswort)
if richtigesPasswort == password:
    print("Bingo!")
else:
    print("Nope")
Ich habe ehrlich gesagt noch so gut wie keine Erfahrung mit Python, also verzeiht mir bitte Mögliche Dummheiten im Code.

Über eine Anwort würde ich mich freuen,
lg
Celamo
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Man baut keine SQL-Statements mit String-operationen zusammen. Siehe https://xkcd.com/327/ Stattdessen benutzt man die parametrisierte Form von execute, und Platzhalter im SQL-Statement. Welche genau, haengt von deiner DB ab.

Wenn man nur ein Ergebnis erwartet, benutzt man fetchone. Sonst bekommt man eine Liste. Und du vergleichst nicht mit einer Liste. Und jede Zeile kommt als Tupel, auch wenn man nur eine Spalte auswaehlt. Also muss das in etwa so aussehen:

Code: Alles auswählen

...
if row := cursor.fetchone() is not None: # falscher Name
    passwort, = row # passwort auspacken
    ...
Dein Code vergleicht aber einen String mit einer Liste mit einem Tupel drin. Das ist immer falsch. Um sowas selbst rauszufinden, einfach mal print() bemuehen, um sich anzuschauen, was man denn da so vor sich hat.

Und dann darf man natuerlich Passwoerter nicht im Klartext speichern! Sondern gesalzen und gehasht!
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Was ist ein Ban-Wender? Sowas wie ein Pfannenwender?
Benutze keine kryptischen Abkürzungen, oder irgendwelche Anhängsel, die nichts-sagend sind.
Gibt es neben dem ALoginID auch ein BLoginID?

Variablennamen schreibt man komplett klein. Soll das `int(username)` nur testen, ob wirklich nur eine Zahl eingegeben worden ist? Denn das Ergebnis der Umwandlung verwirfst Du gleich wieder. Bei einer Zahl wäre User-ID sprechender

Code: Alles auswählen

user_id= int(input("User-ID:"))
password = input("Password:")
cursor.execute("SELECT passwort FROM banwender where ALoginID= %s", [user_id])
result = cursor.fetchone()
if result and result[0] == password:
    print("Bingo!")
else:
    print("Nope")
Je nach Datenbankanbindung kann der Platzhalter auch ? sein.
Passwörter speichert man mit Hilfe eines passenden Passwordhash-Verfahrens.
Antworten