Las aplicaciones web están constantemente expuestas
a muchos peligros en la red y
los delincuentes informáticos se encuentran siempre al acecho.
Es por ello que es importante cerciorarnos de establecer
medidas de seguridad adecuadas para no comprometer la integridad
de nuestra información confidencial.
Cuando utilizamos bases de datos
un tipo común de ataque es la inyección de código malicioso
de sentencias SQL, por medio del cual
un usuario malicioso puede modificar la base de datos
u obtener información sensible al enviar peticiones
no validadas al servidor.
Afortunadamente, ésta es una vulnerabilidad muy conocida y estudiada,
por lo cual existen varias formas de contrarrestarla.
Para el caso de este artículo
utilizaremos la parametrización como medida de seguridad
para evitar que nuestra aplicación sea vulnerada
por un ataque de inyección SQL,
para ello debemos seguir los siguientes pasos:
-
El uso de parámetros como SqlParameterCollection
asegura que los valores de entrada sean verificados por tipo de datos,
tamaño y valores fuera del rango permitido,
generando una excepción en el caso en que no se cumplan.
Además los parámetros son tratados como valores literales
y no como código ejecutable en la base de datos [1].
En el siguiente código se muestra como usar SqlParameterCollection
cuando se invoca a un procedimiento almacenado llamado LoginStoredProcedure,
el cual acepta como entrada el parámetro @au_id tipo varchar(11):
MysecuredApp.java
using System.Data;
using System.Data.SqlClient;
...
using (SqlConnection connection = new SqlConnection(connectionString))
{
DataSet userDataset = new DataSet();
SqlDataAdapter myCommand = new SqlDataAdapter( "LoginStoredProcedure", connection);
myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11);
myCommand.SelectCommand.Parameters["@au_id"].Value = SSN.Text;
myCommand.Fill(userDataset);
}
...
-
En el código anterior, el valor de entrada
no puede tener más de 11 caracteres.
Si los datos no cumplen el tipo
o la longitud que el parámetro tiene definido,
la clase SqlParameter generará una excepción.
Si no puede utilizar procedimientos almacenados,
siga utilizando parámetros cuando construya instrucciones SQL dinámicas.
Con el siguiente código se muestra cómo utilizar
SqlParameterCollection con SQL dinámico [2].
using System.Data;
using System.Data.SqlClient;
...
using (SqlConnection connection = new SqlConnection(connectionString))
{
DataSet userDataset = new DataSet();
SqlDataAdapter myDataAdapter = new SqlDataAdapter(
"SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id",
connection);
myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11);
myCommand.SelectCommand.Parameters["@au_id"].Value = SSN.Text;
myDataAdapter.Fill(userDataset);
}
...