La creazione di una query in questo modo la rende vulnerabile agli attacchi di SQL injection a meno che non sia stato eseguito manualmente l'escape dell'input (ovvero ha reso impossibile per il valore di "projectID" modificare la struttura della query utilizzando sequenze di escape specifiche del motore di database). Tuttavia, il modo consigliato per eseguire questa operazione consiste nell'utilizzare query con parametri (a volte chiamate "Istruzioni preparate"). Con le query parametriche, definisci semplicemente la struttura della query e quindi fornisci i valori di input separatamente come parametri, impedendo che la struttura della tua query venga mai modificata tramite SQL injection.
Ecco il tuo esempio, modificato per utilizzare la parametrizzazione:
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;
}
Il parametro ':ProjectID' nella query verrà sostituito con il valore fornito nel metodo 'AddWithValue'. Indipendentemente dal valore nella variabile 'projectID', verrà sempre valutato come parte della clausola WHERE. considerando che, prima, un valore simile a ['; DELETE FROM project;--] potrebbe avere effetti indesiderati modificando la query in modo che si legga come segue:
select projectName, managerName
from project
where projectID = ''; DELETE FROM project;--'