2012-01-30 10 views
16

Per ottenere alcuni dati sto creando una query sql :)
Ovviamente ci sono alcune parti di filtraggio e di ordinazione.prevenire l'iniezione sql in Oracle "order by" part

Per ottenere il risultato, utilizzo "NamedParameterJdbcTemplate" e quando ho bisogno di aggiungere qualcosa alla parte "where", utilizzo la mappa dei parametri per evitare l'iniezione.

Ma è diverso con la parte "ordine per", in quanto non vi è alcun escape automatico (ed è una parte di sql). Questa parte dell'ordine a volte è piena di dati dell'utente (direttamente), a volte inserisce alcuni parametri di ordinamento extra dal codice interno. C'è un problema: a volte questo campo di ordinamento contiene non solo il nome della colonna, ma una dichiarazione sql.

Ora ogni parametro per l'ordinamento viene sfuggito manualmente sostituendo alcuni caratteri (come ') alla stringa vuota, ma alcuni parametri che impostiamo per il nostro codice è un po' complesso per passare questa regola.

Qual è il modo migliore per impedire le iniezioni SQL nella parte di ordinamento della query, quando si utilizza il modello jdbc?

+9

+1 per la cura :) – RedFilter

+1

Possibile utilizzare 'PreparedStatement'? – Romain

+0

Non so su jdbc ma è possibile utilizzare una variabile di binding in un 'ordine per' in Oracle. – Ben

risposta

7

Per aiutare guardia contro SQL injection sul lato banca dati, hanno uno sguardo al DBMS_ASSERT built-in package Oracle: http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_assert.htm

Si potrebbe trovare la funzione SIMPLE_SQL_NAME contribuirà a proteggere contro SQL Injection per la vostra ORDER BY clausola.

Speranza che aiuta ...

+0

Probabilmente è meglio usare la funzione di escape personalizzata. Se non ci sarà modo di farlo con qualche libreria (jdbctemplate o qualcosa simile), probabilmente lo farà. – Dainius

1

Un modo che ho usato anche se per un po 'diverse ragioni era di usare Ordinato per 3,2 (3 ° colonna, seconda colonna)

Quindi, se si riesce a capire il nome della colonna inserito dalla posizione dell'utente in colonne del uscita, l'indirezione dovrebbe uccidere il vettore di iniezione.

+0

problema che a volte questo campo di ordinamento contiene non solo il nome della colonna, ma una dichiarazione sql – Dainius

+0

Un'istruzione sql inserita dall'utente? –

+0

Non direttamente, alcuni collegamenti hanno parametri passati alla parte "ordina per". La prima ipotesi da risolvere è stata creare la mappa dei campi di ordinamento consentiti e ottenere quel campo in base ai parametri per url, come chiave, qualcosa di simile (o lo stesso) che cosa ha suggerito Vincent. Ma c'è anche un vecchio codice, che non mi piacerebbe molto modificare (chi sa quanto tempo vivrà), e c'è qualche sql. E potrebbe esserci un altro posto dove viene usato questo parametro di ordine. – Dainius

2

Si potrebbe limitare la scelta di ordinamento. La maggior parte delle applicazioni consente solo agli utenti di ordinare da una colonna visualizzata, l'utente può scegliere quale colonna ordinare attraverso la sua posizione di colonna.

In questo caso si accetta solo un numero intero dall'utente (è possibile accettare un numero negativo da ordinare in ordine decrescente). Puoi consentire all'utente di ordinare per più colonne accettando un elenco di numeri interi.

I numeri interi sono facili da controllare e questo non esporrebbe i nomi delle colonne sottostanti all'utente.