At bygge en forespørgsel på denne måde gør den sårbar over for SQL-injektionsangreb, medmindre du manuelt har undslippet dit input (dvs. gjort det umuligt for værdien af 'projectID' at ændre strukturen af forespørgslen ved at bruge databasemotorspecifikke escape-sekvenser). Den anbefalede måde at gøre dette på er dog at bruge parametriserede forespørgsler (nogle gange kaldet "Forberedte erklæringer"). Med parametriserede forespørgsler definerer du blot strukturen af forespørgslen og angiver derefter inputværdierne separat som parametre, hvilket forhindrer strukturen af din forespørgsel i nogensinde at blive ændret via SQL-injektion.
Her er dit eksempel, ændret til at bruge parameterisering:
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;
}
Parameteren ':ProjectID' i forespørgslen vil blive erstattet med værdien angivet i 'AddWithValue'-metoden. Uanset hvilken værdi der er i 'projectID'-variablen, vil den altid blive evalueret som en del af WHERE-sætningen. før, en værdi svarende til ['; DELETE FROM project;--] kunne have uønskede virkninger ved at ændre din forespørgsel til at læse som følger:
select projectName, managerName
from project
where projectID = ''; DELETE FROM project;--'