Escuché que "todo el mundo" está utilizando consultas SQL parametrizadas para protegerse contra ataques de inyección SQL sin tener que validar cada pieza de entrada del usuario.
¿Cómo haces esto? ¿Obtiene esto automáticamente cuando usa procedimientos almacenados?
Entonces, según tengo entendido, esto no está parametrizado:
cmdText = String.Format("SELECT foo FROM bar WHERE baz = '{0}'", fuz)
¿Se parametrizaría esto?
cmdText = String.Format("EXEC foo_from_baz '{0}'", fuz)
¿O necesito hacer algo más extenso como esto para protegerme de la inyección SQL?
With command
.Parameters.Count = 1
.Parameters.Item(0).ParameterName = "@baz"
.Parameters.Item(0).Value = fuz
End With
¿Existen otras ventajas de utilizar consultas parametrizadas además de las consideraciones de seguridad?
Actualización: Este gran artículo fue vinculado en una de las preguntas de referencia de Grotok. http://www.sommarskog.se/dynamic_sql.html
sql
vb.net
sql-parametrized-query
Jim cuenta
fuente
fuente
Respuestas:
Su ejemplo EXEC NO sería parametrizado. Necesita consultas parametrizadas (declaraciones preparadas en algunos círculos) para evitar que entradas como esta causen daños:
Intente poner eso en su variable fuz (o no lo haga, si valora su mesa de bar). También son posibles consultas más sutiles y perjudiciales.
Aquí hay un ejemplo de cómo se hacen los parámetros con Sql Server:
A los procedimientos almacenados a veces se les atribuye la prevención de la inyección de SQL. Sin embargo, la mayoría de las veces todavía tiene que llamarlos usando parámetros de consulta o no ayudan. Si utiliza procedimientos almacenados exclusivamente , puede desactivar los permisos para SELECCIONAR, ACTUALIZAR, ALTERAR, CREAR, ELIMINAR, etc. (casi todo menos EXEC) para la cuenta de usuario de la aplicación y obtener algo de protección de esa manera.
fuente
cmd.Parameters.Add("@Baz", SqlDbType.VarChar, 50).Value = Baz
por favor?@Baz
que es del tipo alvarchar(50)
que se le asigna el valor de laBaz
cadena.AddWithValue("@Baz", Baz)
, podría hacer eso, pero no debería hacerlo , especialmente porque convertir los valores de cadena que se asignan de forma predeterminada al tiponvarchar
realvarchar
es uno de los lugares más comunes que pueden desencadenar los efectos mencionados en ese enlace.Definitivamente el último, es decir
Las consultas parametrizadas tienen dos ventajas principales:
fuente
Desea ir con su último ejemplo, ya que este es el único que está realmente parametrizado. Además de las preocupaciones de seguridad (que son mucho más frecuentes de lo que podría pensar) es mejor dejar que ADO.NET maneje la parametrización, ya que no puede estar seguro de si el valor que está pasando requiere comillas simples alrededor de él o no sin inspeccionar el
Type
de cada parámetro. .[Editar] Aquí hay un ejemplo:
fuente
La mayoría de la gente haría esto a través de una biblioteca de lenguaje de programación del lado del servidor, como PDO de PHP o Perl DBI.
Por ejemplo, en DOP:
Esto se encarga de escapar sus datos para la inserción de la base de datos.
Una ventaja es que puede repetir una inserción muchas veces con una declaración preparada, obteniendo una ventaja de velocidad.
Por ejemplo, en la consulta anterior, podría preparar la declaración una vez, y luego recorrer la creación de la matriz de datos a partir de un montón de datos y repetir -> ejecutar tantas veces como sea necesario.
fuente
Su texto de comando debe ser como:
Luego agregue los valores de los parámetros. De esta manera se asegura que el valor con solo termine usándose como valor, mientras que con el otro método si la variable fuz se establece en
¿Puedes ver lo que podría pasar?
fuente
Aquí hay una clase corta para comenzar con SQL y puede construir desde allí y agregar a la clase.
MySQL
MS SQL / Express
fuente