sql >> Databáze >  >> RDS >> Oracle

Vytváření dynamického dotazu v C# (SQL Injection Attack)

Vytváření dotazu tímto způsobem jej činí zranitelným vůči útokům SQL injection, pokud jste ručně neuvedli svůj vstup (tj. znemožnili hodnotě 'projectID' změnit strukturu dotazu pomocí sekvencí escape specifických pro databázový stroj). Doporučeným způsobem, jak toho dosáhnout, je však použití parametrizovaných dotazů (někdy nazývaných "Připravené příkazy"). U parametrizovaných dotazů jednoduše definujete strukturu dotazu a poté poskytujete vstupní hodnoty samostatně jako parametry, čímž zabráníte tomu, aby se struktura vašeho dotazu někdy změnila pomocí SQL injection.

Zde je váš příklad, změněn na použití parametrizace:

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' v dotazu bude nahrazen hodnotou uvedenou v metodě 'AddWithValue'. Bez ohledu na to, jaká hodnota je v proměnné 'projectID', bude vždy vyhodnocena jako součást klauzule WHERE. vzhledem k tomu, že dříve hodnota podobná [“; DELETE FROM project;--] může mít nežádoucí účinky, pokud změníte dotaz takto:

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


  1. SQLite JSON_GROUP_OBJECT()

  2. Urychlí použití LIMIT 1 dotaz na primární klíč?

  3. Jak vybrat sloupec statických hodnot?

  4. Jak používat Oracle Associative Array v dotazu SQL