Fluid Attacks logo
Contact Us
Young hacker smiling
Zero false positives

Expert intelligence + effective automation

Prevenir Inyección SQL Mediante Parametrización

Necesidad

Se requiere evitar inyecciones de código SQL en una aplicación ASP.NET.

Contexto

A continuación se describe las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. La aplicación esta construida en ASP.NET versión 1.1, 2.0 o superior.

  2. Se utiliza la versión del .NET Framework 1.0,1.1 o superior.

  3. La aplicación requiere conectarse a una base de datos para realizar operaciones de select, update y delete.

Solución

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:

  1. 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
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    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);
    }
    ...
    
  2. 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].

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    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);
    }
    ...
    

Service status - Terms of Use