Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + tecnología especializada

Prevenir Inyección SQL Mediante Parametrización

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en ASPNET al prevenir las inyecciones SQL mediante parametrización. Es importante proteger las aplicaciones contra los ataques más comunes entre ellos se encuentra el SQLi.

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);
    }
    ...
    



Haz un comentario

Estado de los servicios - Términos de Uso