Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + automatización eficaz

Prevenir Inyección de Código SQL

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en C Sharp al prevenir la inyección de código SQL. Las inyecciones de código representan una vulnerabilidad común y peligrosa en las aplicaciones. Aquí te mostramos cómo evitarlas.

Necesidad

Prevenir inyección de código SQL en C Sharp .

Contexto

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

  1. La aplicación está construida con el lenguaje de programación C Sharp.

  2. Se utiliza la versión de .NET Framework 1.0 o superior.

  3. La aplicación requiere de una conexión a una base de datos relacional a través del lenguaje de consulta SQL.

  4. Se debe tener acceso al código fuente para poder modificarlo y añadir la solución.

Solución

Para evitar que sea el usuario quien directamente ingrese los datos a la consulta realizada en la base de datos, es recomendable utilizar sentencias parametrizadas o sentencias con contenedores. La razón de esto es para que gestor no interactúe con dichos datos como si fueran parte de la sentencia SQL, si no más bien como datos almacenados en variables.

Cabe notar que los datos ingresados no serán modificados al momento de ser almacenados, sin importar los caracteres especiales que compongan la sentencia. Ésto permite evadir un ataque de inyección de código SQL, sin embargo, no previene un ataque de secuencia de comandos en sitios cruzados (XSS), pues al quedar almacenado el código tal y como fue ingresado, cabe la posibilidad de que posteriormente se ejecute al ser cargado en la interfaz de la base de datos directamente, convirtiéndose así en un ataque XSS persistente. A continuación, se muestra parte de código que cumple con las características de uso de sentencias parametrizadas para consultas sobre una base de datos, a partir de una cadena de caracteres ingresada:

program.cs
 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(DataConnectionString)){
    DataSet userDataset = new DataSet();
    SqlDataAdapter myCommand = new SqlDataAdapter("SELECT nombre, apellido
      FROM Autores
      WHERE au_id = @au_id", connection);
    myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11);
    myCommand.SelectCommand.Parameters["@au_id"].Value = Identificador;
    myDataAdapter.Fill(userDataset);
  }
...

En el anterior código se puede ver la conexión a una base de datos, la ejecución del comando SELECT, y cómo los datos que se reciben al parámetro @au_id desde la variable Identificador. Además observamos como al momento de indicar el parámetro, se le asigna el tipo de valor SqlDbType.VarChar, de tamaño 11. El ejemplo anterior es muy válido para casos donde no se esté usando procedimientos almacenados. En otros casos, se reemplazaría todo el comando de la sentencia SQL por el nombre mismo del procedimiento y se añadiría otra línea más de código. Como resultado obtendríamos lo siguiente:

1
2
3
4
5
6
7
8
using (!SqlConnection connection = new !SqlConnection(!DataconnectionString)){
  DataSet userDataset = new !DataSet();
  SqlDataAdapter myCommand = new !SqlDataAdapter(nombre_procedimiento_almacenado, connection);
  myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
  myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11);
  myCommand.SelectCommand.Parameters["@au_id"].Value = Identificador;
  myDataAdapter.Fill(userDataset);
}

Descargas

program.cs Contiene el programa descrito anteriormente, mostrando la forma de prevenir inyecciones de código SQL en C Sharp.




Haz un comentario

Estado de los servicios - Términos de Uso