Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Construindo uma consulta dinâmica em C# (SQL Injection Attack)


Construir uma consulta dessa maneira a torna vulnerável a ataques de injeção de SQL, a menos que você tenha escapado manualmente de sua entrada (ou seja, tornou impossível para o valor de 'projectID' alterar a estrutura da consulta usando sequências de escape específicas do mecanismo de banco de dados). No entanto, a maneira recomendada de fazer isso é usando consultas parametrizadas (às vezes chamadas de "Declarações Preparadas"). Com consultas parametrizadas, você simplesmente define a estrutura da consulta e fornece os valores de entrada separadamente como parâmetros, evitando que a estrutura de sua consulta seja alterada por injeção de SQL.

Aqui está o seu exemplo, alterado para usar a parametrização:
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;
}

O parâmetro ':ProjectID' na consulta será substituído pelo valor fornecido no método 'AddWithValue'. Não importa qual valor esteja na variável 'projectID', ele sempre será avaliado como parte da cláusula WHERE. Considerando que, antes, um valor semelhante a ['; DELETE FROM project;--] pode ter efeitos indesejáveis ​​alterando sua consulta para ler da seguinte forma:
select projectName, managerName
  from project
  where projectID = ''; DELETE FROM project;--'