2

如果我使用 SubSonic 为我的 Web 项目创建 DAL,我是否需要担心防止 SQL 注入攻击?

4

4 回答 4

6

不,SubSonic 使用参数将数据传递到数据库中,它会处理这个问题。

于 2009-05-05T08:04:06.327 回答
6

这取决于您如何构建查询。如果您不使用参数,则完全有可能使用亚音速编写不安全的查询。

// 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);
于 2009-05-05T17:09:17.843 回答
3

最简洁的答案是不。如果您使用 Subsonic Generated 类或 Subsonic.Select 类来生成查询/更新/插入语句,那么您无需担心 SubSonic 正确使用参数。

然而,Paul 确实指出,如果您不遗余力地编写不安全的 SQL,SubSonic 将允许您这样做。SubSonic 不是您的母亲,它不会阻止您,它更像是您最好的朋友,它会告诉您不要这样做,但如果您决定这样做,那是您的决定。

于 2009-05-05T17:29:34.330 回答
1

只是为了重新提出保罗的例子(如果你是 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
于 2009-05-31T09:26:31.977 回答