Sql Injection Attacks e Subsonic
-
05-07-2019 - |
Domanda
Se utilizzo SubSonic per creare DAL per il mio progetto Web, devo preoccuparmi di prevenire attacchi SQL Injection?
Soluzione
Dipende da come costruisci le tue query. È assolutamente possibile scrivere query non sicure con subsonico se non si utilizzano parametri.
// Bad example:
string sql = "delete from Products where ProductName = " + rawUserInput;
QueryCommand qry = new QueryCommand(sql, Product.Schema.Provider.Name);
DataService.ExecuteQuery(qry);
// Should be:
string sql = "delete from Products where ProductName = @TargetName";
QueryCommand qry = new QueryCommand(sql, Product.Schema.Provider.Name);
qry.AddParamter("@TargetName", rawUserInput, DbType.String);
DataService.ExecuteQuery(qry);
Altri suggerimenti
No, SubSonic utilizza i parametri per passare i dati nel database, se ne occupa.
La risposta breve è no. Se si utilizzano le classi Subsonic Generated o Subsonic.Select per generare le istruzioni query / aggiornamento / inserimento, non è necessario preoccuparsi che SubSonic utilizzi correttamente i parametri.
Paul ha sottolineato tuttavia che se si fa di tutto per scrivere un SQL non sicuro che SubSonic ti permetterà. SubSonic non è tua madre, non ti fermerà, è più simile alla tua migliore amica, ti dirà di non farlo, ma se decidi di farlo è una tua decisione.
Giusto per riproporre l'esempio di Paul (se hai vincoli FK)
string rawUserInput = "Queso Cabrales1";
#region BadExample
//string sql = "delete from Products where ProductName = " + rawUserInput;
////QueryCommand objQueryCommand = new QueryCommand(sql, Product.Schema.Provider.Name);
////DataService.ExecuteQuery(objQueryCommand);
#endregion BadExample
#region BetterExample
// Should be:
string sql = "update Products set ProductName = @ProductName where ProductName='Queso Cabrales'";
QueryCommand objQueryCommand = new QueryCommand(sql, Northwind.Product.Schema.Provider.Name);
objQueryCommand.AddParameter("@ProductName" , rawUserInput, DbType.String);
DataService.ExecuteQuery(objQueryCommand);
panGvHolder.Controls.Clear();
Query qry = Northwind.Product.CreateQuery();
qry.Columns.AddRange(Northwind.Product.Schema.Columns);
qry.WHERE("UnitPrice > 15").AND("UnitsInStock < 20 ");
//WHERE("UnitPrice > 15").AND("UnitsInStock < 30 ");
#endregion BetterExample
#region PresentResultsReplaceResponseWriteWithConsole.WriteLineForConsoleApp
using (IDataReader rdr = qry.ExecuteReader())
{
Response.Write("<table>");
while (rdr.Read())
{
Response.Write("<tr>");
for (int i = 0; i < rdr.FieldCount; i++)
{
Response.Write("<td>");
Response.Write(rdr[i].ToString() + " ");
Response.Write("<td>");
} //eof for
Response.Write("</br>");
Response.Write("</tr>");
}
Response.Write("<table>");
}
#endregion PresentResultsReplaceResponseWriteWithConsole.WriteLineForConsoleApp
} //eof method