Login Problem

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Hypec
User
Beiträge: 143
Registriert: Mittwoch 1. August 2018, 16:11

Samstag 9. Februar 2019, 20:18

Hallo,
ich hab versucht mit dem Code unten ein Login für eine Flask Webseite einzurichten. Ich habe momentan 2 angelegte Nutzer mit Name, Passwort und einer ID. Die Funktion von mir erkennt jede Eingabe als richtigen Namen an und wenn dazu noch das Passwort vom ersten Benutzer eingegeben wird, ist man eingeloggt. Das Passwort des 2. Benutzers wird allerdings auch in Kombination mit dem Richtigen Namen als Falsch ausgegeben.
Weiß jemand wie ich diese beiden Probleme behebe, so dass nur die richtige Kombination aus Nutzername und Passwort als richtig anerkannt wird?

Code: Alles auswählen

import uuid
import hashlib

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        name = request.form['username']
        password = request.form['password']
        database_password = " "
        database_password_str = ""

        conn = psycopg2.connect(port="5432")
        print ("Opened database successfully")
        cur = conn.cursor()
        cur.execute("SELECT NAME FROM USERS ORDER BY NAME")
        rows = cur.fetchall()
        print(rows)

        for name in rows:
            if name in rows:
                index = rows.index(name)
                print('User Found')
                cur.execute("SELECT PASSWORD FROM USERS ORDER BY PASSWORD")
                row = cur.fetchall()

                database_password = row[index]
                [(database_password_str)] = database_password

                if check_password(database_password_str, password):
                    session['username'] = request.form['username']
                    cur.execute("SELECT ID FROM USERS ORDER BY ID")
                    id = cur.fetchone()
                    #[(id, )] = id
                    id = str(id)
                    return redirect('dashboard/' + id)
                else:
                    wrongpwd = 1
                    return render_template('login.html', wrongpwd=wrongpwd)
            else:
                return ''' False'''
    return render_template('login.html')
    
def hash_password(password):
    salt = uuid.uuid4().hex
    return hashlib.sha256(salt.encode() + password.encode()).hexdigest() + ':' + salt

def check_password(hashed_password, user_password):
    password, salt = hashed_password.split(':')
    return password == hashlib.sha256(salt.encode() + user_password.encode()).hexdigest() 
Sirius3
User
Beiträge: 9680
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 9. Februar 2019, 20:43

Datenbanken sind dafür berühmt, dass man Daten mit Bedingung abfragen kann. Wenn also der Name in der sortieren Reihenfolge einen bestimmten Index hat, dann passt auch das sortierte Passwort dazu?
Was soll die for-Schleife und das `if name in rows`? Natürlich ist jedes Element der Liste rows in dieser Liste auch enthalten.

Das sieht doch alles schrecklich geraten aus.

Code: Alles auswählen

def login():
    if request.method == 'POST':
        name = request.form['username']
        password = request.form['password']

        conn = psycopg2.connect(port="5432")
        cur = conn.cursor()
        cur.execute("SELECT id, password FROM users WHERE name=?", [name])
        rows = cur.fetchone()
        if rows:
            user_id, password_hash = rows
            if check_password(password_hash, password):
                session['username'] = username
                return redirect('dashboard/{}'.format(user_id))
        return render_template('login.html', wrongpwd=True)
    return render_template('login.html')
Statt einen eigenen Passwort-Hash zu erfinden, nimm ein etabliertes Verfahren.
Antworten