Pregunta

Si uso SubSonic para crear DAL para mi proyecto web, ¿debo preocuparme por prevenir ataques de inyección de SQL?

¿Fue útil?

Solución

Esto depende de cómo construyas tus consultas. Es totalmente posible escribir consultas inseguras con subsónico si no utiliza 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);

Otros consejos

No, SubSonic usa parámetros para pasar datos a la base de datos, se encarga de esto.

La respuesta corta es no. Si usa las clases generadas por Subsonic o la clase Subsonic.Select para generar sus consultas / actualización / inserción de instrucciones, entonces no debe preocuparse, ya que SubSonic usa los parámetros correctamente.

Sin embargo, Paul señaló que si se sale del camino para escribir SQL no seguro, SubSonic le permitirá hacerlo. SubSonic no es tu madre, no te detendrá, es más como tu mejor amiga, te dirá que no, pero si decides hacerlo, esa es tu decisión.

Solo para volver a presentar el ejemplo de Paul (si tiene restricciones 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top