2008-10-30 35 views
69

Sto scrivendo una funzione di ricerca e ho pensato a questa query usando i parametri per prevenire, o almeno limitare, attacchi di SQL injection. Tuttavia, quando l'eseguo il mio programma che non restituisce nulla:Come fare? Parametri e istruzione LIKE SQL

SELECT * FROM compliance_corner WHERE (body LIKE '%@query%') OR (title LIKE '%@query%')

Può parametri da utilizzare in questo modo? o sono validi solo in un'istanza come:

SELECT * FROM compliance_corner WHERE body LIKE '%<string>%' (dove <string> è l'oggetto di ricerca).

EDIT: Sto costruendo questa funzione con VB.NET, ha un impatto sulla sintassi che voi ragazzi avete contribuito?

Inoltre, ho eseguito questa istruzione in SQL Server: SELECT * FROM compliance_corner WHERE (body LIKE '%max%') OR (title LIKE% max% ') `e restituisce risultati.

risposta

71

Il codice Visual Basic sarebbe simile a questa:

Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE '%' + @query + '%') OR (title LIKE '%' + @query + '%')") 

cmd.Parameters.Add("@query", searchString) 
+1

Come Adam ha sottolineato nella sua risposta, questo non protegge contro l'iniezione SQL. La query deve essere parametrizzata. – DOK

+5

Potrebbe fornire un esempio in cui ciò non impedisce l'iniezione SQL? Dal mio test funziona bene – John

+25

Non è possibile eseguire l'iniezione 'SQL', solo l'iniezione' LIKE'. Ciò significa che l'utente può inserire caratteri speciali come '%' '^' e '_' che' LIKE' interpreterà in modo speciale. Ciò significa che l'utente potrebbe non ottenere ciò che si aspetta per determinate ricerche. Ad esempio, la ricerca di "meno dell'1% di grassi" può restituire il risultato "meno dell'1% dei medici lo consiglia, è pieno di grassi!". –

1

Potrebbe essere necessario concatenare i segni% con la vostra parametro, ad es .:

LIKE '%' || @query || '%'

Modifica: In realtà, ciò potrebbe non avere alcun senso. Penso di aver frainteso il tuo problema.

23

si hanno a che fare:

LIKE '%' + @param + '%'

+0

+ 1 breve e semplice –

+0

soluzione eccellente - sarebbe dare più di uno se possibile! Grazie –

100

Beh, mi piacerebbe andare con:

Dim cmd as New SqlCommand(
"SELECT * FROM compliance_corner"_ 
    + " WHERE (body LIKE @query)"_ 
    + " OR (title LIKE @query)") 

cmd.Parameters.Add("@query", "%" +searchString +"%") 
+0

Questo è corretto, la risposta accettata fornita da John ha la sintassi sbagliata! – Adam

+3

Non sono sicuro di come la sua sintassi non sia corretta, la sua soluzione ha funzionato bene. Ho una funzione che costruisce e restituisce un'istruzione SQL per l'uso in un datatable o qualsiasi altra cosa. – Anders

+1

Nota aggiuntiva: Sintassi per C# utilizzando MySQLDataAdapter = da = new MySQLDataAdapter ("SELECT * FROM tableA WHERE fieldA = @fieldA"); da.SelectCommand.Parameters.AddWithValue ("@ fieldA", "%" + someValue + "%"); –

1

A volte il simbolo usato come segnaposto % non è lo stesso se si esegue una query da VB come quando la si esegue da MS SQL/Access. Prova a cambiare il simbolo del segnaposto da % a *. Potrebbe funzionare.
Tuttavia, se si esegue il debug e si desidera copiare la stringa SQL direttamente in MS SQL o Access per testarlo, potrebbe essere necessario riportare il simbolo su % in MS SQL o Access per restituire effettivamente i valori.

Spero che questo aiuti

0

prova anche in questo modo

Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE CONCAT('%',@query,'%') OR title LIKE CONCAT('%',@query,'%'))") 
cmd.Parameters.Add("@query", searchString) 
cmd.ExecuteNonQuery() 

Usato Concat invece di +