sql >> Databasteknik >  >> RDS >> Oracle

Bygga en dynamisk fråga i C# (SQL Injection Attack)

Att bygga en fråga på det här sättet gör den sårbar för SQL-injektionsattacker om du inte manuellt har undkommit din inmatning (dvs. gjorde det omöjligt för värdet av 'projectID' att ändra strukturen på frågan genom att använda databasmotorspecifika escape-sekvenser). Det rekommenderade sättet att göra detta är dock att använda parametriserade frågor (ibland kallade "Förberedda uttalanden"). Med parametriserade frågor definierar du helt enkelt strukturen för frågan och anger sedan indatavärdena separat som parametrar, vilket förhindrar att strukturen på din fråga någonsin ändras via SQL-injektion.

Här är ditt exempel, ändrat för att använda parameterisering:

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

Parametern ':ProjectID' i frågan kommer att ersättas med värdet som anges i 'AddWithValue'-metoden. Oavsett vilket värde som finns i variabeln 'projectID', kommer det alltid att utvärderas som en del av WHERE-satsen. Tidigare ett värde liknande ['; DELETE FROM project;--] kan få oönskade effekter genom att ändra din fråga så att den lyder enligt följande:

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


  1. mysql:uppdatera med underfråga,

  2. Vad är standardrotlösenordet för MySQL 5.7

  3. Hur man får MySQL att hantera UTF-8 korrekt

  4. SQL:Hämta poster som uppfyller villkor som kommer från flera poster