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

6

いいえ、SubSonicは、パラメータを使用してデータベースにデータを渡します。これは、これを処理します。

4

短い答えはいいえです。 Subsonic GeneratedクラスまたはSubsonic.Selectクラスを使用してクエリ/更新/挿入ステートメントを生成する場合、SubSonicがParametersを正しく使用することを心配する必要はありません。

しかし、あなたが安全でないSQLを書いてしまって、SubSonicがあなたを許してしまうのであれば、Paulはそれを指摘しました。亜音速はあなたの親友に似ていますが、それはあなたの決定であることを決めるならば、あなたに言わないでしょう。

1

ポールのジャスト再存在する例(あなたが制約をF​​K場合)

 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 
関連する問題