Hallo zusammen, ich trainiere, um mit Flask und Python ein Web zu erstellen. Ich habe Db eingerichtet und dies ist der Code für mein Login:
@app.route('/login/', methods=["POST","GET"])
def loginpage():
message=""
c, conn = connection()
try:
if request.method=="GET":
return render_template("login.html",message=message)
if request.method=="POST":
data=c.execute("SELECT * FROM user WHERE username = '%s'"%(request.form['username']) )
data=c.fetchone()[2]
if data==request.form['password']:
message = "Success"
session['loged-in']=True
session['username']="flag{lol_lel_lul}"
return render_template("login.html",message=message)
else :
message ="Unknown user"
return render_template("login.html",message=message)
except Exception as e:
message=str(e)
return render_template("login.html", message=message)
Aber wenn ich es teste, gibt es immer diesen Fehler zurück.'NoneType' object has no attribute '__getitem__' das ich behoben habe, aber es ist immer noch nicht viel besser
Wer kann mir helfen, es zu bekommen?
Hilf mir, den Code zu lösen
Bitte setzen deinen Code in Code-Tags.
Die Tags werden generiert, wenn du den </>-Button über dem Eingabefeld drückst.
Und dann verrate uns bitte dein konkretes Problem. Ein Fehler, den du behoben hast und es jetzt noch immer nicht viel besser ist, ist wenig hilfreich.
Bitte poste doch die Fehlermeldung komplett und ebenfalls in Code-Tags.
Auffällig ist auf jeden Fall schon einmal diese Codezeile:
c, conn = connection()
Sicher, dass hier 2 Objekte von connection() zurückgegeben werden?
Die Tags werden generiert, wenn du den </>-Button über dem Eingabefeld drückst.
Und dann verrate uns bitte dein konkretes Problem. Ein Fehler, den du behoben hast und es jetzt noch immer nicht viel besser ist, ist wenig hilfreich.
Bitte poste doch die Fehlermeldung komplett und ebenfalls in Code-Tags.
Auffällig ist auf jeden Fall schon einmal diese Codezeile:
c, conn = connection()
Sicher, dass hier 2 Objekte von connection() zurückgegeben werden?
- __blackjack__
- User
- Beiträge: 13533
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@krrish389: Gut dass das nicht funktioniert, dann kann niemand die fette SQL-Injection-Lücke ausnutzen. Du formatierst den Benutzernamen der vom Benutzer kommt, direkt in eine Zeichenkette mit SQL-Abfrage. Das macht macht man nicht. Für Daten kommen Platzhalter ins SQL und die Daten selbst werden als zweites Argument von `execute()` übergeben.
Code: Alles auswählen
- (void)countSheep {
unsigned int sheep = 0;
while ( ! [self isAsleep]) { ++sheep; }
}
Woher kommt denn `connection` und warum liefert die schon ein Cursor-Objekt? Diese erstellt man selbst, wenn man sie braucht.
Neben der SQL-Injection sollte man auch kein SELECT-* benutzen, sondern die Spalten explizit angeben, die man haben möchte, hier wahrscheinlich nur `password`.
Der Rückgabewert von execute wird gar nicht benutzt (und ist normalerweise auch nicht sinnvoll zu benutzen). `data` ist dann für das Passwort zu generisch.
Klartext-Passwörter sollte man nie speichern, in keiner Datenbank; dafür brauchst Du eine für Passwörter gedachte Hash-Funktion.
Wie kommt denn der Wert für session['username'] zustande? Und warum wird man wieder auf die Login-Seite geleitet, wenn der Login erfolgreich war?
Fehlermeldungen sollten nicht ungefiltert an den Nutzer zurückgegeben werden, weil der sonst zusätzliche Information über das System erhält, um es eventuell anzugreifen (z.B. indem er sieht, dass eine SQL-Injektion erfolgreich auszuführen ist und auf diese Weise von die Struktur der Datenbank abfragen kann). Fehler gehören in die Server-Logs.
Neben der SQL-Injection sollte man auch kein SELECT-* benutzen, sondern die Spalten explizit angeben, die man haben möchte, hier wahrscheinlich nur `password`.
Der Rückgabewert von execute wird gar nicht benutzt (und ist normalerweise auch nicht sinnvoll zu benutzen). `data` ist dann für das Passwort zu generisch.
Klartext-Passwörter sollte man nie speichern, in keiner Datenbank; dafür brauchst Du eine für Passwörter gedachte Hash-Funktion.
Wie kommt denn der Wert für session['username'] zustande? Und warum wird man wieder auf die Login-Seite geleitet, wenn der Login erfolgreich war?
Fehlermeldungen sollten nicht ungefiltert an den Nutzer zurückgegeben werden, weil der sonst zusätzliche Information über das System erhält, um es eventuell anzugreifen (z.B. indem er sieht, dass eine SQL-Injektion erfolgreich auszuführen ist und auf diese Weise von die Struktur der Datenbank abfragen kann). Fehler gehören in die Server-Logs.