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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top