Budowanie zapytania w ten sposób sprawia, że jest ono podatne na ataki wstrzyknięcia SQL, chyba że ręcznie zmieniłeś znaczenie danych wejściowych (tj. uniemożliwiło wartość „projectID” zmianę struktury zapytania przy użyciu sekwencji ucieczki specyficznych dla silnika bazy danych). Jednak zalecanym sposobem, aby to zrobić, jest użycie zapytań parametrycznych (czasami nazywanych „Przygotowanymi instrukcjami”). W przypadku zapytań parametrycznych po prostu definiujesz strukturę zapytania, a następnie podajesz wartości wejściowe oddzielnie jako parametry, zapobiegając zmianie struktury zapytania przez wstrzyknięcie SQL.
Oto twój przykład, zmieniony na użycie parametryzacji:
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' w zapytaniu zostanie zastąpiony wartością podaną w metodzie 'AddWithValue'. Bez względu na to, jaka wartość znajduje się w zmiennej „projectID”, zawsze będzie ona oceniana jako część klauzuli WHERE. poprzednio wartość podobna do ['; USUŃ Z projektu;--] może mieć niepożądane skutki, zmieniając zapytanie na następujące:
select projectName, managerName
from project
where projectID = ''; DELETE FROM project;--'