sql >> データベース >  >> RDS >> Oracle

C#で動的クエリを構築する(SQLインジェクション攻撃)

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


    1. PostgreSQL:forループを使用してテーブルの行を反復処理し、現在の行に基づいて列の値を取得します

    2. OracleSQLの動的ピボット

    3. EssentialPostgreSQLモニタリング-パート1

    4. 現在の日付に従ってデータを並べ替える