SubSonic を使用して Web プロジェクト用の DAL を作成する場合、SQL インジェクション攻撃の防止について心配する必要はありますか?
質問する
1590 次
4 に答える
6
これは、クエリの作成方法によって異なります。パラメータを使用しない場合、subsonic で安全でないクエリを作成することは完全に可能です。
// 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 に答える
6
いいえ、SubSonic はパラメータを使用してデータベースにデータを渡します。これは SubSonic が処理します。
于 2009-05-05T08:04:06.327 に答える
3
短い答えはノーです。Subsonic で生成されたクラスまたは Subsonic.Select クラスを使用してクエリ/更新/挿入ステートメントを生成する場合、SubSonic がパラメーターを正しく使用することを心配する必要はありません。
ただし、Paul は、危険な SQL をわざわざ書く場合でも、SubSonic が許可することを指摘しました。SubSonic はあなたの母親ではありません。あなたを止めることはありません。あなたの親友のようなものです。そうしないように指示しますが、そうすることにした場合、それはあなたの決断です。
于 2009-05-05T17:29:34.330 に答える
1
ポールの例を再提示するだけです(FK Constraint の場合)
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 に答える