sql >> Base de Datos >  >> RDS >> Oracle

Construyendo una consulta dinámica en C# (ataque de inyección SQL)

La creación de una consulta de esta manera la hace vulnerable a los ataques de inyección de SQL a menos que haya escapado manualmente de su entrada (es decir, hizo imposible que el valor de 'projectID' cambiara la estructura de la consulta mediante el uso de secuencias de escape específicas del motor de base de datos). Sin embargo, la forma recomendada de hacerlo es mediante consultas parametrizadas (a veces denominadas "Declaraciones preparadas"). Con las consultas parametrizadas, simplemente define la estructura de la consulta y luego proporciona los valores de entrada por separado como parámetros, lo que evita que la estructura de su consulta cambie alguna vez a través de la inyección de SQL.

Aquí está su ejemplo, modificado para usar la parametrización:

public DataSet GetProject(string projectID)
{
   DataSet dataTable = new DataSet(); 
   DataAccess dataAccess = new DataAccess();
   OracleCommand commandOb = new OracleCommand();
   strQuery = @"select projectName, managerName
                  from project
                  where projectID = :ProjectID"

   cmd.CommandText = strQuery;
   cmd.Parameters.AddWithValue("ProjectID", projectID);
   dataTable = dataAccess.ExecuteDataAdapter(commandOb);

   return dataTable;
}

El parámetro ':ProjectID' en la consulta se reemplazará con el valor dado en el método 'AddWithValue'. No importa qué valor esté en la variable 'projectID', siempre se evaluará como parte de la cláusula WHERE. Considerando que, antes, un valor similar a ['; DELETE FROM project;--] podría tener efectos no deseados al cambiar su consulta para que diga lo siguiente:

select projectName, managerName
  from project
  where projectID = ''; DELETE FROM project;--'