Utilizzo di pysqlite Sto facendo una procedura per fare qualcosa con alcuni dati. Lo stesso tipo di operazione viene eseguita su campi simili in più tabelle e colonne, così ho pensato che potrei parametrizzare l'istruzione SQL come illustrato di seguito:pysqlite: sostituzione segnaposto per nomi di colonne o tabelle?
def foo():
column = 'c'
table = 't'
row = 1
# preferred approach, gives syntax error
c.execute('SELECT ? FROM ? WHERE id=?', (column, table, row))
# sanity check, works fine
c.execute('SELECT c FROM t WHERE id=?', (row))
# workaround, also works, but is this the right way?
c.execute('SELECT % FROM % WHERE id=?' % (column, table), row))
L'errore che ottengo non è molto utile (sqlite3.OperationalError: near "?": syntax error
), ma io ottenere il punto: Pysqlite non apprezza i segnaposto utilizzati in questo modo.
Qualcuno può indicare cosa sta succedendo qui insieme al modo corretto di fare quanto sopra?
È sicuro dall'iniezione SQL? – berkelem
@berkelem: è vulnerabile all'iniezione SQL. Sfortunatamente, poiché i nomi di colonne e tabelle non sono parametrizzabili, non c'è modo di evitare la formattazione delle stringhe. [Usare le whitelist] (https://phpdelusions.net/sql_injection#whitelist) è una buona pratica qui. – unutbu