in SQL statements (ich werde mich hier vornehmlich auf SQLite3 beziehen) soll man gemäß Python Doku ja die Substitutionen per "?" oder ":name" vornehmen. Wegen SQL-Injections. Das ist auch völlig in Ordnung.
Meine Frage ist: Ist das auch so, wenn ich die query erst als Liste anlege und in der execute Funktion den String per ' '.join(Liste) verkette? Zur Verdeutlichung ein kleines Minimalbeispiel:
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sqlite3
def main():
# Erst mal eine kleine Datenbank bauen
connection = sqlite3.connect(':memory:')
cursor = connection.cursor()
cursor.execute('''
CREATE TABLE test (
id INTEGER PRIMARY KEY NOT NULL UNIQUE,
nutzlast TEXT NOT NULL
);
''')
inhalt = [(1, 'Eintrag 5'),
(2, 'Eintrag 4'),
(3, 'Eintrag 3'),
(4, 'Eintrag 2'),
(5, 'Eintrag 1')]
# So soll es ja sein
cursor.executemany('INSERT INTO test VALUES (?, ?)', inhalt)
connection.commit()
# Jetzt zur Frage:
# Hat das folgende Konstrukt auch die benannte Sicherheitslücke? Die
# Ersetzung der Werte im f-String passiert doch schon vor der Substitution
# in der Abfrage während dem append(). Damit wäre die Gefahr der SQL-
# Injection doch vom Tisch, oder?
field = 'id'
#field = 'nutzlast'
query = ['SELECT * FROM test']
query.append(f'ORDER BY {field}')
result = cursor.execute(' '.join(query))
rows = cursor.fetchall()
for row in rows:
print(f'{row[0]:2} {row[1]}')
if __name__ == '__main__':
main()
# vim:tw=79:nowrap
Gruß
Maschinenhans