Атаки впрыскивания Sql и дозвуковой - PullRequest
2 голосов
/ 05 мая 2009

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

Ответы [ 4 ]

6 голосов
/ 05 мая 2009

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

// 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);
6 голосов
/ 05 мая 2009

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

4 голосов
/ 05 мая 2009

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

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

1 голос
/ 31 мая 2009

Просто чтобы представить пример Павла (если вы ограничены 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...