Oracle
 sql >> Base de données >  >> RDS >> Oracle

Construire une requête dynamique en C# (SQL Injection Attack)

Construire une requête de cette manière la rend vulnérable aux attaques par injection SQL à moins que vous n'ayez échappé manuellement votre entrée (c'est-à-dire qu'il est impossible pour la valeur de 'projectID' de modifier la structure de la requête en utilisant des séquences d'échappement spécifiques au moteur de base de données). Cependant, la méthode recommandée consiste à utiliser des requêtes paramétrées (parfois appelées "instructions préparées"). Avec les requêtes paramétrées, vous définissez simplement la structure de la requête, puis fournissez les valeurs d'entrée séparément en tant que paramètres, empêchant ainsi la structure de votre requête d'être modifiée via l'injection SQL.

Voici votre exemple, modifié pour utiliser le paramétrage :

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

Le paramètre ':ProjectID' dans la requête sera remplacé par la valeur donnée dans la méthode 'AddWithValue'. Quelle que soit la valeur de la variable 'projectID', elle sera toujours évaluée dans le cadre de la clause WHERE. Alors qu'auparavant, une valeur similaire à ['; DELETE FROM project;--] pourrait avoir des effets indésirables en modifiant votre requête pour qu'elle se lise comme suit :

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