2009-08-13 15 views
12

Sto sviluppando un'applicazione in AIR tramite Flex, ma non vedo dove sto andando male con SQLite (sono abituato a MySQL). I parametri funzionano, ma solo in alcuni casi. Questa parte del sistema di pulizia integrato contro l'iniezione di sql? Grazie per qualsiasi aiuto!Parametri SQLite - Non consentire tablename come parametro

Works:

SQLite

"si inserisce: i campi di Categoria", dove il parametro è: Campi = "*"

AS3

var statement:SQLStatement = new SQLStatement(); 
statement.connection = connection; 
statement.text = "INSERT :Fields FROM Category"; 
statement.parameters[":Fields"] = "*"; 
statement.execute; 

Do esn't lavoro (errore di sintassi SQL in ": Tabella"):

SQLite

"si inserisce: Campi DA: Tabella", dove i parametri sono: Fields = "*" e: Tabella = "Categoria"

AS3

var statement:SQLStatement = new SQLStatement(); 
statement.connection = connection; 
statement.text = "INSERT :Fields FROM :Table"; 
statement.parameters[":Fields"] = "*"; 
statement.parameters[":Table"] = "Category"; 
statement.execute; 

risposta

30

Generalmente non si può utilizzare parametri SQL/segnaposto per identificatori di database (tabelle, colonne, viste, schemi , ecc.) o funzioni di database (ad esempio, CURRENT_DATE), ma invece solo per i valori letterali vincolanti .

Con il supporto server per istruzioni parametrizzate (ovvero preparate), il motore DB analizza la query una volta, ricordando le peculiarità di qualsiasi parametro (tipi, lunghezze massime, precisioni, ecc.) Che vincolerai nelle esecuzioni successive della query già analizzata. Ma la query non può essere analizzata correttamente nei suoi elementi sintattici se i bit critici, come gli oggetti del database, sono sconosciuti.

Quindi, in genere è necessario sostituire i nomi di tabella, in una stored procedure o in un codice client che concatena/interpola/whatevers dinamicamente l'istruzione SQL per essere eseguita correttamente. In ogni caso, ricorda di utilizzare la funzione API SQL per citando gli identificatori del database, poiché l'API non lo farà per te.

+1

Il tuo primo paragrafo dice tutto. – Lucky

-1

Non sono sicuro se questo è lo stesso, ma mi sono imbattuto in qualcosa di simile a Java. In pratica non è possibile aggiungere una tabella come parametro per cui è necessario generare l'istruzione in questo modo:

var statement:SQLStatement = new SQLStatement(); 
statement.connection = connection; 
statement.text = stringUtil.substitute("INSERT :Fields FROM {0}", "Category"); 
statement.parameters[":Fields"] = "*"; 
statement.execute; 

Questo è molto probabilmente non è la soluzione più sicuro, così si potrebbe desiderare di alcuni convalida personalizzata dei dati prima di aggiungere il nome della tabella .. in modo che qualcuno non cerca di inviare il nome della tabella "; rilasciare tableName ..."

Problemi correlati