2011-01-26 20 views
7

Estoy teniendo una duda sobre esta situación.Cláusula like e inyección sql

tengo una consulta como esta dentro de un procedimiento almacenado:

SELECT column1, column2 
FROM table1 
WHERE column1 like '%' + @column1 + '%' 

Mi pregunta es, esto es vulnerable a la inyección de SQL? ¿Es necesario cambiar esto a algo como esto: (?)

declare @column1Like nvarchar(200); 

@column1Like = '%' + @column1 + '%' 

SELECT column1, column2 
FROM table1 
WHERE column1 like @column1Like 

Saludos

Respuesta

6

La respuesta rápida es no. Para ser vulnerable a la inyección de SQL, uno debe usar la ejecución de SQL dinámico.

Este sería vulnerable:

EXECUTE ('SELECT column1, column2 FROM table1 WHERE column1 like ' + @column1Like); 

Eso también significa que no hay ninguna diferencia real entre ambos de sus ejemplos (desde un punto de vista de la seguridad por lo menos).

1

No es vulnerable, puesto que ya es un valor de cadena en el espacio de SQL. Aunque, podría romper la consulta.

2
SELECT column1, column2 
FROM table1 
WHERE column1 like '%' + @column1 + '%' 

Dado que esta consulta sólo funciona con variables, no tiene lugar para poner código en lugar de los datos y por lo tanto no es vulnerable a SQL inyección.

Por supuesto, supongo que @column1 aquí es una variable SQL Server y está utilizando la funcionalidad de consulta parametrizada en su idioma del lado del cliente para vincular un valor a la misma.

+1

Sí, soy muy cuidadoso acerca de los problemas de seguridad. Pero este no lo entendí: P –

1

Su consulta no es vulnerable a la inyección de SQL en ningún caso porque está utilizando una consulta parametrizada.

2

Me gusta no es diferente de = o cualquier otro predicado.

Sin embargo, el usuario puede insertar caracteres comodín adicionales (%, _) en el patrón; si eso importa

-1

creo que es vulnerable, por ejemplo: '%' o 1 = 1-- mostrará todos los registros de la base de datos si no te gusta el formato que @column1Like.

En este caso, Creo que es el mismo que (o @column1Like= ''@column1Like is null) pero hay que pensar en otros ejemplos como

'%' union select SELECT `column11`, `column22` 
FROM table2 where `colum11` -- is the same type than `column1` 
--and `column22` is the same type than `column22`. 
Cuestiones relacionadas