Hilf mir, den Code zu lösen

Code-Stücke können hier veröffentlicht werden.
Antworten
krrish389
User
Beiträge: 1
Registriert: Dienstag 8. Januar 2019, 07:18

Dienstag 8. Januar 2019, 07:57

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?
Benutzeravatar
sparrow
User
Beiträge: 890
Registriert: Freitag 17. April 2009, 10:28

Dienstag 8. Januar 2019, 09:57

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?
Benutzeravatar
__blackjack__
User
Beiträge: 1930
Registriert: Samstag 2. Juni 2018, 10:21

Dienstag 8. Januar 2019, 10:06

@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.
Having more money does not insure happiness. People with ten million dollars are no happier than people with nine million dollars. – Hobart Brown
Sirius3
User
Beiträge: 9051
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 8. Januar 2019, 11:30

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.
Antworten