sqlite3 und prepared statements

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Wieso funktionieren eigentlich prepared statements nicht bei create?
Als Beispiel:

Code: Alles auswählen

import sqlite3

conn = sqlite3.connect("test.db")
cur = conn.cursor()
cur.execute("create table ?(bla int)", ("db",))
conn.close()
sqlite3.OperationalError: near "?": syntax error
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
BlackJack

@darktrym: Die Platzhalter sind ausschliesslich für Werte.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

D.h. wenn ich diese Funktionalität benötige muss ich die Anfrage selbst zusammenbasteln, wovor die Hilfe Seiten ja warnen.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

darktrym hat geschrieben:D.h. wenn ich diese Funktionalität benötige muss ich die Anfrage selbst zusammenbasteln, wovor die Hilfe Seiten ja warnen.
Ja musst Du. Aber wenn Du nicht gerade ein Web basiertes DB-Management-Tool schreibst, brauchst Du so etwas ja idR. auch nie.

In diesem Falle könntest Du Dir die Namensbeschränkungen von SQLite bei Tabellennamen zunutze machen, den eigegebenen Ausdruck entsprechend gegen diese Konvention zu parsen. Damit sollte es kaum möglich sein, eine SQL-Injection durchzuführen.

Und Du kannst diese Stelle über Autorisierung absichern, so dass nicht jeder 0815-Benutzer diesen Code überhaupt aktivieren kann.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten