2010-09-17 17 views

Respuesta

10

No, no puede evitar todos los ataques de inyección SQL mediante el uso de parámetros. SQL dinámico es el problema real, y esto puede ocurrir tanto en los procedimientos almacenados como en el código de la aplicación.

por ejemplo, este es propenso a un ataque de inyección SQL: consulta parametrizada pasa un nombre de usuario para un procedimiento almacenado, y dentro del procedimiento almacenado del parámetro se concatena con un comando SQL y luego ejecutado.

Para ver un ejemplo de muchos tipos de ataques de inyección SQL, consulte este SQL Injection Cheat Sheet. Verá que simplemente escapando comillas simples está rascando la superficie, y que hay muchas formas de evitarlo.

+0

¿cuál es la solución? –

+0

@MH: reemplazando todos 'con' ' –

+0

La solución es nunca usar SQL dinámico. Si esto no es posible, debe llegar a extremos extremos para asegurarse de que escapa correctamente cualquier cadena que se concatenará a una declaración de SQL, y también considerar cómo la cadena se organiza en todos los dominios (por ejemplo, HTML -> Javascript - -> codificación URL ->), ya que puede haber complicaciones adicionales debido a esas transformaciones. – RedFilter

2

Si va a construir una consulta SQL dinámica con esos parámetros (pasados ​​a un procedimiento almacenado, por ejemplo), entonces existe la posibilidad de inyección sql si no se toman precauciones.

9

Sí y no. Sí, si todas las declaraciones SQL son estáticas y solo usan parámetros, entonces estás 100% protegido contra ataques de inyección SQL.

El problema surge cuando los parámetros mismos se utilizan para construir sentencias SQL dinámicas. Un ejemplo sería un procedimiento almacenado que genera una instrucción SQL de forma dinámica para consultar una multitud de opciones diferentes, donde una única instrucción monolítica sería poco práctica. Si bien hay mejores soluciones para este problema, este es un problema común.

+0

100%, es decir, suponiendo que MS o Novell no cometieron ningún error. –

1

Siempre puede minimizar el riesgo de inyección SQL mediante el uso de declaraciones preparadas, siempre que su motor de base de datos las admita.

De todos modos, las declaraciones preparadas son probablemente la forma más segura de bloquear las inyecciones de SQL.

5

Sí, puede evitar todos los ataques de inyección SQL mediante el uso de parámetros, siempre que use parámetros exclusivamente en la pila de llamadas. Por ejemplo:

  • El código de su aplicación llama a un procedimiento almacenado o SQL dinámico en la base de datos. Eso debe usar parámetros para pasar todos los valores.
  • El procedimiento almacenado o SQL dinámico construye internamente una llamada a otro procedimiento almacenado o declaración de SQL dinámico. Eso también debe usar parámetros para pasar todos los valores.
  • Repite ad infinitum hasta que te quedes sin código.

Si está programando en SQL Server, puede usar sp_executesql para ejecutar SQL dinámico, y le permitirá definir y pasar valores parametrizados a la instrucción que se está ejecutando.

+0

+1 Creo que la gente olvida que puede usar parámetros con SQL dinámico. – dotjoe

1

El problema es construir la instrucción SQL dinámicamente.

Por ejemplo, es posible que desee ordenar el resultado en función de la columna que seleccionó el usuario. En la mayoría de las bases de datos, no puede usar parámetros aquí ("¿ORDEN POR?" No funciona). Entonces tienes que "ORDER BY" + columna. Ahora, si "columna" es una Cadena, entonces el usuario de su aplicación web podría inyectar código allí (lo cual no es fácil, pero es posible).

Cuestiones relacionadas