Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Aufbau einer dynamischen Abfrage in C# (SQL Injection Attack)

Das Erstellen einer Abfrage auf diese Weise macht sie anfällig für SQL-Injection-Angriffe, es sei denn, Sie haben Ihre Eingabe manuell maskiert (d. h. es wurde dem Wert von „projectID“ unmöglich gemacht, die Struktur der Abfrage zu ändern, indem Sie datenbankmodulspezifische Escape-Sequenzen verwenden). Die empfohlene Vorgehensweise hierfür ist jedoch die Verwendung parametrisierter Abfragen (manchmal auch als „vorbereitete Anweisungen“ bezeichnet). Bei parametrisierten Abfragen definieren Sie einfach die Struktur der Abfrage und stellen dann die Eingabewerte separat als Parameter bereit, wodurch verhindert wird, dass die Struktur Ihrer Abfrage jemals per SQL-Injection geändert wird.

Hier ist Ihr Beispiel, das geändert wurde, um Parametrisierung zu verwenden:

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;
}

Der Parameter ':ProjectID' in der Abfrage wird durch den in der Methode 'AddWithValue' angegebenen Wert ersetzt. Unabhängig davon, welcher Wert in der Variable „projectID“ steht, wird er immer als Teil der WHERE-Klausel ausgewertet. Während zuvor ein Wert ähnlich ['; DELETE FROM project;--] könnte unerwünschte Auswirkungen haben, wenn Sie Ihre Abfrage wie folgt ändern:

select projectName, managerName
  from project
  where projectID = ''; DELETE FROM project;--'