2012-11-05 12 views
5

Dal punto di vista convalida di protezione, c'è una differenza tra:Utilizzando dichiarazione preparata nel modo più sicuro

stmt.setObject(1, theObject);

e

stmt.setString(1, theObject);?

So che in questo caso theObject è un String ma io sono interessato a fare parte di questo codice più generale per coprire altri casi e si chiedeva se la prospettiva di sicurezza di convalida dell'input è influenzato

risposta

0

IMHO

Dato che JDBC è un wrapper molto leggera intorno al server di database (si fa poco altro che generare il codice SQL per il DB di interpretare direttamente), mi aspetto

stmt.setObject(1, theObject); 

essere esattamente lo stesso che

stmt.setString(1, theObject == null ? "null" : theObject.toString())`; 

La "convalida del tipo" accadrà quando il database elabora l'SQL risultante e trova se si adatta esso.

+2

JDBC e ODBC sono due tecnologie diverse e JDBC non è un wrap around ODBC (sebbene esista un bridge). – Paolo

+0

@Paolo Lo so, ero a corto di un'espressione in quel momento. L'ho cambiato per 'database engine', che è una soluzione migliore. – SJuan76

+0

Ma se questo è tutto come viene applicata la convalida dell'input? Stringhe non correttamente rimosse ecc.? – Jim

1

È possibile utilizzare s setObject() poiché jdbc proverà a eseguire la risoluzione del tipo per tutti i tipi java.lang.*.

Tuttavia, c'è potenziale problema con il passaggio di una stringa SQL arbitraria al database in questo modo - Sicurezza scappatoie: senza convalida molto giudizioso di eventuali parametri che si utilizzano per costruire la stringa SQL, siete responsabili a vari tipi di attacchi di inserimento SQL.

Attenzione di passaggio non tipizzato null a setObject()

+0

Il passaggio di una stringa SQL è un problema anche per 'setString'? – Jim

+0

sì. È necessario eseguire un controllo sandbox prima di eseguire la dichiarazione. – aviad

+0

Questo non suona corretto. Ho letto che si consiglia di utilizzare 'PreparedStatements' per l'input corretto. Stai dicendo * I * sono responsabile di" analizzare "le stringhe sql in anticipo? – Jim

0

La risposta sembra essere correlata fornitore e dipende dell'attuazione del conducente. Controllo l'origine del driver postgresql corrente e le due chiamate sono uguali.

Se il driver non conosce il tipo viene generata un'eccezione.

+0

Se questo è il modo in cui viene eseguito, come viene applicata la convalida dell'input? – Jim

+0

@Jim Quale altro tipo di convalida vuoi? Ad esempio, sql injection può funzionare solo con le stringhe ma solo se non è corretto "escape". Spero che questo lavoro faccia il provider jdbc giusto MrGreen. Su altri tipi il cast si bloccherà. – OkieOth

+0

Controllare risposta @ aviad.Seems implicare altrimenti – Jim

Problemi correlati