如果我使用SubSonic为我的Web项目创建DAL,我是否需要担心防止SQL注入攻击?
答案 0 :(得分:6)
不,SubSonic使用参数将数据传递到数据库中,它会解决这个问题。
答案 1 :(得分: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);
答案 2 :(得分:4)
简短的回答是否定的。如果使用Subsonic Generated类或Subsonic.Select类生成查询/更新/插入语句,则无需担心SubSonic正确使用参数。
保罗确实指出,如果您不遗余力地编写SubSonic允许您使用的不安全SQL。 SubSonic不是你的母亲,它不会阻止你它更像是你最好的朋友,它会告诉你不要,但如果你决定这样做,这是你的决定。
答案 3 :(得分: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