661
24.5
Das Modul sqlite3
Beachten Sie, dass das zweite Argument auch dann ein Tupel sein muss, wenn der erste
String nur einen einzigen Fragezeichen-Platzhalter enthält. Denken Sie an das Komma
nach dem einzigen Element im Tupel.
24.5.4 SQL-Injections
Das letzte Problem hätte man auch mit einer String-Formatierung lösen können:
Hier wurde die
execute()-Methode nur mit einem Argument (ohne Fragezeichen-Platzhal-
ter) aufgerufen. Der variable Teil – ein String mit dem Namen einer Person – wurde direkt
in den String mit der SQL-Anweisung eingepflanzt.
Das sollten Sie niemals tun! Denn das ist ein Sicherheitsrisiko. In diesem Beispiel besteht
natürlich keine direkte Gefahr. Aber in realen Programmen haben Sie oft keine Kontrolle
darüber, was in der Variablen, deren Inhalt in die SQL-Anweisung kommt, tatsächlich steht.
Angenommen, Ihr Datenbankprogramm soll einem Benutzer alle seine gespeicherten per-
sonenbezogenen Daten liefern (hier nur Name und Telefonnummer). Und zwar nur seine
Daten und nicht die Daten anderer Personen. Dann könnte sich jemand über einen
geschickt gewählten Namen Zugang zum Inhalt der gesamten Tabelle erschleichen. Probie-
ren Sie es aus.
Sie sehen: Alle Daten der Tabelle wurden ausgegeben. Wie kommt das? Schauen Sie sich die
SQL-Anweisung an, die durch das Formatieren entsteht:
>>> print(list(c))
[('Melanie Beck', '02302 89912')]
>>> a = "Melanie Beck"
>>> muster = """SELECT * FROM person WHERE name = "{}";"""
>>> c.execute(muster.format(a))
<sqlite3.Cursor object at 0x02A2FF80>
>>> print(list(c))
[('Melanie Beck', '02302 89912')]
>>> a = "Anonym\" OR \"1\" = \"1"
>>> ergebnis = c.execute(muster.format(a))
>>> print(list(ergebnis))
[('Melanie Beck', '02302 89912'), ('Moritz Blau', '0201 841111'),
('Tim Groß', '0251 199348')]
>>> print(muster.format(a)
SELECT * FROM person WHERE name = "Anonym" OR "1" = "1";

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.