Daten aus DB mit Variable vergleichen.

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Theynk
User
Beiträge: 22
Registriert: Donnerstag 8. März 2018, 14:20

Ich habe ein Problem. Hoffentlich seid ihr nochmal so nett und helft mir. Und zwar möchte ich ein Servicebereich haben, indem man natürlich nur per Passwort kommen soll. Da dieses Passwort später auch mal geändert werden soll, habe ich einfach eine Tabelle in der Datenbank mit den Spalten "ID" und "Passwort" erstellt. Nun soll das Programm das dort eingetragene Passwort auslesen und mit dem eingegebenen vergleichen. Auslesen etc alles kein Problem. Allerdings sobald ich vergleiche sagt er immer, dass das Passwort korrekt ist. Hier mal der Code:

def weiter_einlernen():
Passwort = Eingabefeld_Passwort.get()
FensterEinlernen1.destroy()

print(Passwort)

Verbindung = mysql.connector.connect(user = '***', password = '***', host='***' ,database = '***')

cursor = Verbindung.cursor()

cursor.execute("SELECT ID, Passwort FROM Passwort WHERE ID = '{}'".format("1"))

for(ID, Passwort) in cursor:

#Daten aus der Datenbank in Variablen schreiben
aktuelles_Passwort = '{}'.format(Passwort)
print(aktuelles_Passwort)

#Passworteingabe korrekt
if str(aktuelles_Passwort) == str(Passwort):

FensterEinlernen2 = Toplevel()
FensterEinlernen2.title("Service")
FensterEinlernen2.geometry('800x480')
Xpos = 0
Ypos = 0
FensterEinlernen2.geometry("+%d+%d" % (Xpos, Ypos))

Ich habe den Vergleich erst ohne "str" und dann mal mit gemacht um einfach zu probieren ob es klappt doch es ändert sich nichts. Wenn ich allerdings statt für "Passwort" z.B. "v" eingebe sagt er mir, dass das Passwort nicht korrekt ist. (Natürlich geht der Code danach noch weiter allerdings geht es ja nur um den IF-Satz. Ich sage schon mal Danke.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Theynk: niemals in SQL-Statements per format Parameter eintragen; für so etwas gibt es Platzhalter! Passwort ist hoffentlich schon ein String, da macht das '{}'.format(Passwort) keinen Sinn. Die for-Schleife sollte überflüssig sein, da es zu jeder ID nur ein Passwort geben kann. Die Variable in der for-Schleife heißt gleich, wie die Variable, die das eingegebene Passwort enthält, zweiteres wird also mit ersterem Überschrieben und dann mit sich selbst verglichen.

Bei einem Programm, auf das man als Nutzer Zugriff hat, sind Passwort-Vergleiche eigentlich überflüssig. Eine einfache Abfrage "Sind Sie sich sicher?" hat das gleiche Sicherheitsniveau. Passwörter niemals im Klartext irgendwo speichern. Es gibt genug Leute, die ihr Passwort an mehreren Stellen benutzen und somit hat jeder, der auf das Programm Zugriff hat, auch potentiell Zugriff auf alle Dienste, die der Passworthinterleger sonst so benutzt.
Theynk
User
Beiträge: 22
Registriert: Donnerstag 8. März 2018, 14:20

Super danke. Manchmal sieht man vor lauter Bäumen den Wald nicht. Das mit dem überschreiben war das Problem. Die Methode mit den Platzhalter kenne ich, nutze ich allerdings nur wenn ich mit mehreren Variablen arbeite. Wieso macht man es denn nicht auf diese Weise?

Da das für mein Abschlussprojekt ist, und der Auftraggeber das so möchte, werde ich es machen auch wenn es nicht viel Sinn ergibt. Da ist auch erstmal nur ein Standardpasswort drin was später geändert werden soll.

Ich danke dir für deine Hilfe.:)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Theynk: was ist der Grund, warum Du die Platzhalter erst bei mehr als einem benutzt? Platzhalter sind einfacher, lesbarer, fehlerfreier, wartbarer, sicherer, und es gibt keinen Grund sie nicht zu benutzen.

Falscher Umgang mit Passwörtern erhöht nicht die Sicherheit, sondern vermindert sie. Pseudo-Sicherheit hat zusätzlich die Gefahr, dass jemand glauben könnte, das wäre tatsächlich sicher. So solltest Du das auch Deinem Auftraggeber mitteilen. Die Lösung hier ist auch ganz einfach. Verschiebe die Authentifizierung in die Datenbank und regle den Zugriff über den Zugriff auf Tabellen des Datenbanknutzers.
Theynk
User
Beiträge: 22
Registriert: Donnerstag 8. März 2018, 14:20

Ok besten danke für deine Hilfe. Werde ich Ihm so mitteilen.
Antworten