# Auf dem Server einloggen und sich mit der (default) Datenbank postgres verbinden
# Auf dem Server einloggen und sich mit der (default) Datenbank postgres verbinden
# password: postgres
psql -h localhost -U postgres -d postgres
psql -h localhost -U postgres -d postgres
```
```
...
@@ -48,12 +49,16 @@ python main.py "'; update users set is_admin = 'true' where username = 'mallory'
...
@@ -48,12 +49,16 @@ python main.py "'; update users set is_admin = 'true' where username = 'mallory'
```
```
Ruft man nun die Funktion wieder mit dem Benutzernamen auf `python main.py "mallory"` bekommt man statt `False` nun ein `True` zurückgegeben.
Ruft man nun die Funktion wieder mit dem Benutzernamen auf `python main.py "mallory"` bekommt man statt `False` nun ein `True` zurückgegeben.
Die Schwachstelle in der Abfrage besteht darin, da keine Überprüfung erfolgt, welcher `string` in die Abfrage übergeben wird. Das Semikolon innerhalb der Abfrage spielt eine Entscheide Rolle, da es SQL Abfragen terminiert. Da keine weitere Überprüfung, des Inhalts erfolgt, den wir an die Funktion übergeben, können wir nun mithilde eines `UPDATE` Befehls Werte innerhalb der Tabelle anpassen.
Die Schwachstelle in der Abfrage besteht darin, da keine Überprüfung erfolgt, welcher `string` in die Abfrage übergeben wird. Das Semikolon innerhalb der Abfrage spielt auch eine Entscheide Rolle, da es SQL Abfragen terminiert. Da keine weitere Überprüfung, des Inhalts erfolgt, den wir an die Funktion übergeben, können wir nun mithilde eines `UPDATE` Befehls Werte innerhalb der Tabelle anpassen.
Die Schwachstelle im Code (`SQL Abfrage`) kann wie folgt behoben werden:
Die Schwachstelle im Code (`SQL Abfrage`) kann wie folgt behoben werden:
```
```
# Alternative 1
"""SELECT is_admin FROM users WHERE username = %(username)s """, {'username': username}
"""SELECT is_admin FROM users WHERE username = %(username)s """, {'username': username}
# Alternative 2
"""SELECT is_admin FROM users WHERE username = %s ;""", [username]
```
```
Die Query wird nicht mehr mittels String Interpolation (`'%s' """ % username`) zusammengesetzt und an den Datenbankserver gesendet. Durch Abfrageparameter `%(username)s """, {'username': username}` wird nun sichergestellt, das der richtige Typ und Wert als `Parameter` an die Abfrage übergeben wird.
Die Query wird nicht mehr mittels String Interpolation (`'%s' """ % username`) zusammengesetzt und an den Datenbankserver gesendet. Durch die Vermeidung von Single Quotes `%(username)s """, {'username': username}` wird nun sichergestellt, das der richtige Typ und Wert als `Parameter` an die Abfrage übergeben wird.