2011-09-11 7 views
8

sto cercando di cambiare la user_version di un database SQLite tramite Python 2.6, e ho cercato di fare quanto segue:Non è possibile utilizzare la sostituzione del parametro sqlite3 con PRAGMA?

cur.execute("PRAGMA user_version = ?" , (version,)) 

Viene a mancare con il seguente errore:

cur.execute("PRAGMA user_version = ?" , (version,)) 
sqlite3.OperationalError: near "?": syntax error 

I ho provato lo stile di sostituzione con nome (invece dei punti interrogativi) ma anche quello con lo stesso errore.

Se inserisco un numero all'interno come parte della stringa SQL o utilizzando le operazioni con le stringhe di Python, tutto funziona correttamente, ma preferirei non eseguire nessuna di queste.

Quindi perché non funziona?
E come posso inserire un numero di sicurezza da una variabile in questa chiamata?

risposta

4

Solo determinati valori possono essere parametrizzati. Anche i nomi di tabelle e colonne non possono essere parametrizzati. Il tuo esperimento mostra che i valori di pragma non possono essere parametrizzati.

Il user_version è expected to be an integer. È possibile utilizzare la formattazione di stringhe e proteggersi allo stesso tempo con

cur.execute("PRAGMA user_version = {v:d}".format(v=version)) 

Il formato {v:d} solleverà un ValueError se version non è un numero intero.

+0

Ok, ho pensato, potrebbe essere il caso. Quindi, come posso inserire i valori in modo sicuro? Se il suo uso solo interno è semplice concat di stringa o% di Python accettabile qui? – DMA57361

+1

Questo è un buon metodo per gestire la limitazione quando il parametro è un numero intero. Se invece il parametro di un altro pragma era una stringa, non sarebbe necessario verificare il formato (ad es. Un numero intero come 7 è valido come "7") ma i parametri dovrebbero comunque essere sottoposti a escape per evitare l'iniezione SQL. C'è un modo conveniente per farlo? – spaaarky21

+0

@ spaaarky21: Non sono a conoscenza di alcuna funzione fornita da sqlite3 per fare quoting manuale. Per altri pragma che accettano stringhe, forse il modo più sicuro sarebbe enumerare una whitelist di input ammissibili e controllare l'input dell'utente rispetto a questo set. – unutbu

Problemi correlati