この方法でクエリを作成すると、入力を手動でエスケープしない限り、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;--'