Estoy escribiendo una función de búsqueda y he pensado en esta consulta utilizando parámetros para prevenir, o al menos limitar, ataques de inyección SQL. Sin embargo, cuando lo ejecuto a través de mi programa, no devuelve nada:
SELECT * FROM compliance_corner WHERE (body LIKE '%@query%') OR (title LIKE '%@query%')
¿Se pueden usar los parámetros de esta manera? o solo son válidos en una instancia como:
SELECT * FROM compliance_corner WHERE body LIKE '%<string>%'
(donde <string>
está el objeto de búsqueda).
EDITAR: Estoy construyendo esta función con VB.NET, ¿eso tiene un impacto en la sintaxis que ustedes han contribuido?
Además, ejecuté esta declaración en SQL Server: SELECT * FROM compliance_corner WHERE (body LIKE '%max%') OR (title LIKE
% max% ') `y eso devuelve resultados.
SQL
inyecciones, soloLIKE
inyecciones. Esto significa que el usuario puede ingresar caracteres especiales como%
^
y_
queLIKE
interpretará especialmente. Esto significa que es posible que el usuario no obtenga lo que espera de determinadas búsquedas. Por ejemplo, una búsqueda de'less than 1% fat'
puede devolver el resultado'less than 1% of doctors recommend this - it's full of fat!'
.searchString.Replace("[","[[]").Replace("%","[%]").Replace("_","[_]")
, lo que permitirá la inyección LIKE (siempre que no esté usando la cláusula de escape).Bueno, iría con:
Dim cmd as New SqlCommand( "SELECT * FROM compliance_corner"_ + " WHERE (body LIKE @query )"_ + " OR (title LIKE @query)") cmd.Parameters.Add("@query", "%" +searchString +"%")
fuente
cmd.Parameters.Add
conviertecmdLoad.Parameters.AddWithValue
o hay algún problema? Entiendo que la respuesta de James es de 2008 :)tu tienes que hacer:
LIKE '%' + @param + '%'
fuente
Puede que tenga que concatenar los signos% con su parámetro, por ejemplo:
COMO '%' || @query || '%'
Editar: En realidad, eso puede no tener ningún sentido en absoluto. Creo que he entendido mal tu problema.
fuente
A veces, el símbolo utilizado como marcador de posición
%
no es el mismo si ejecuta una consulta desde VB que cuando la ejecuta desde MS SQL / Access. Intente cambiar su símbolo de marcador de posición de%
a*
. Aquello podría funcionar.Sin embargo, si depura y desea copiar su cadena SQL directamente en MS SQL o Access para probarla, es posible que deba volver a cambiar el símbolo a
%
MS SQL o Access para devolver valores.Espero que esto ayude
fuente
prueba también de esta manera
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()
Usó Concat en lugar de +
fuente