Ataques de injeção SQL e Subsonic
-
05-07-2019 - |
Pergunta
Se eu usar SubSonic para criar DAL para o meu projeto web que eu preciso se preocupar com a prevenção de ataques de injeção SQL?
Solução
Isso depende de como você construir suas consultas. É totalmente possível escrever consultas inseguras com subsônico se você não usar parâmetros.
// 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);
Outras dicas
Não, parâmetros usos SubSonic para transmitir dados no banco de dados, ele cuida disso.
A resposta curta não é. Se você usar as classes Subsonic gerados ou a classe Subsonic.Select para gerar o seu consultas / update / insert declarações, então você não precisa se preocupar em que SubSonic usa parâmetros corretamente.
Paul fez notar, porém, que se você sair de sua maneira de escrever SQL insegura que SubSonic vai permitir que você. SubSonic não é sua mãe não vai parar você é mais como seu melhor amigo, ele vai dizer não, mas se você decidir fazê-lo, que é a sua decisão.
Apenas para re-presente o exemplo de Paul (se você restrições 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