Вопрос

Если я использую SubSonic для создания DAL для своего веб-проекта, нужно ли мне беспокоиться о предотвращении SQL-инъекций?

Это было полезно?

Решение

Это зависит от того, как вы строите свои запросы. Полностью возможно писать небезопасные запросы с дозвуковым, если вы не используете параметры.

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

Другие советы

Нет, SubSonic использует параметры для передачи данных в базу данных, об этом позаботится.

Краткий ответ - нет. Если вы используете классы Subsonic Generated или Subsonic.Select для генерации ваших запросов / обновлений / вставок, вам не нужно беспокоиться о том, что SubSonic правильно использует параметры.

Пол, однако, указал, что если вы изо всех сил будете писать небезопасный SQL, SubSonic позволит вам. SubSonic не твоя мать, она не остановит тебя, она больше похожа на твоего лучшего друга, она скажет тебе не делать этого, но если ты решишь это сделать, это твое решение.

Просто для того, чтобы вновь представить пример Пола (если у вас ограничения 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top