Vytváření dotazu tímto způsobem jej činí zranitelným vůči útokům SQL injection, pokud jste ručně neuvedli svůj vstup (tj. znemožnili hodnotě 'projectID' změnit strukturu dotazu pomocí sekvencí escape specifických pro databázový stroj). Doporučeným způsobem, jak toho dosáhnout, je však použití parametrizovaných dotazů (někdy nazývaných "Připravené příkazy"). U parametrizovaných dotazů jednoduše definujete strukturu dotazu a poté poskytujete vstupní hodnoty samostatně jako parametry, čímž zabráníte tomu, aby se struktura vašeho dotazu někdy změnila pomocí SQL injection.
Zde je váš příklad, změněn na použití parametrizace:
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;
}
Parametr ':ProjectID' v dotazu bude nahrazen hodnotou uvedenou v metodě 'AddWithValue'. Bez ohledu na to, jaká hodnota je v proměnné 'projectID', bude vždy vyhodnocena jako součást klauzule WHERE. vzhledem k tomu, že dříve hodnota podobná [“; DELETE FROM project;--] může mít nežádoucí účinky, pokud změníte dotaz takto:
select projectName, managerName
from project
where projectID = ''; DELETE FROM project;--'