Question

Si j'utilise SubSonic pour créer DAL pour mon projet Web, dois-je m'inquiéter de la prévention des attaques par injection SQL?

Était-ce utile?

La solution

Cela dépend de la manière dont vous construisez vos requêtes. Il est tout à fait possible d'écrire des requêtes non sécurisées avec subsonic si vous n'utilisez pas de paramètres.

// 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);

Autres conseils

Non, SubSonic utilise des paramètres pour transmettre des données à la base de données, il s'en charge.

La réponse courte est non. Si vous utilisez les classes Subsonic Generated ou la classe Subsonic.Select pour générer vos requêtes / update / insert, vous n'avez pas à vous inquiéter du fait que SubSonic utilise correctement les paramètres.

Paul a toutefois souligné que si vous vous efforcez d'écrire du code SQL non sécurisé, ce que SubSonic vous le permet. SubSonic n’est pas votre mère, elle ne vous arrêtera pas, c’est plutôt votre meilleure amie, elle vous dira de ne pas le faire, mais si vous décidez de le faire, c’est votre décision.

Juste pour représenter l'exemple de Paul (si vous avez des contraintes 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top