2009-05-05 115 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