2009-05-05 87 views

回答

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); 
+0

不,我们不会使用被直接使用SQL,因此我可以假设,我们将亚音速安全! – TheVillageIdiot 2009-05-06 09:05:03

6

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

4

简短的回答是否定的。如果您使用Subsonic Generated类或Subsonic.Select类来生成查询/更新/插入语句,那么您不必担心SubSonic会正确使用参数。

但是,Paul指出,如果你不想写出SubSonic允许的不安全SQL。 SubSonic不是你的母亲,它不会阻止你,它更像你最好的朋友,它会告诉你不要,但如果你决定这样做,那是你的决定。

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