Изграждането на заявка по този начин я прави уязвима за атаки чрез SQL инжектиране, освен ако ръчно не сте избягали от входа си (т.е. направи невъзможно стойността на „projectID“ да промени структурата на заявката чрез използване на специфични последователности за избягване на двигателя на базата данни). Препоръчителният начин за това обаче е използването на параметризирани заявки (понякога наричани „Подготвени отчети“). С параметризираните заявки вие просто дефинирате структурата на заявката и след това предоставяте входните стойности отделно като параметри, предотвратявайки промяната на структурата на вашата заявка чрез SQL инжектиране.
Ето вашия пример, променен за използване на параметризиране:
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;
}
Параметърът „:ProjectID“ в заявката ще бъде заменен със стойността, дадена в метода „AddWithValue“. Без значение каква е стойността в променливата 'projectID', тя винаги ще се оценява като част от клаузата WHERE. Докато преди стойност, подобна на ['; DELETE FROM project;--] може да има нежелани ефекти, ако промените заявката си така, че да се чете по следния начин:
select projectName, managerName
from project
where projectID = ''; DELETE FROM project;--'