我有以下功能:這是從SQL注入返回DataTable安全的方法嗎?
public DataTable GetRecordSet(String query, string[] parameters)
它通常用於如下:
DataTable dt = GetRecordSet("select * from objects where ob_id = @obid and ac_id = @acid", new[] { objectId, accountId });
的GetRecordSet方法解析查詢參數,尋找前面帶@的話,並撰寫傳遞到合適的SqlParameter對象一個SqlCommand對象。在這種情況下,將創建兩個參數。
查詢參數將始終由我提供,參數數組可能具有來自用戶的數據。
我擔心,因爲我從一個字符串生成參數名稱,我可能以某種方式無意中規避了反SQL注入對策。這種方法是否安全?
更新: GetRecordSet得到一個選擇命令如下:
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = GetSqlCommand(query, parameters);
的GetSqlCommand方法:
private SqlCommand GetSqlCommand(string query, string[] parameters)
{
SqlCommand sq = new SqlCommand(query, myConnection);
// enum parameters
// get name of parameter from the query string and add it to the SqlCommand
SqlParameter p;
string[] paramNames = query.Split('@');
string name;
int paramCounter = 0;
if (parameters != null)
{
foreach (string param in parameters)
{
paramCounter += 1;
if (param != "")
{
try
{
if (paramNames.Length > paramCounter)
{
name = paramNames[paramCounter].Split(' ')[0];
p = new SqlParameter(name, param);
sq.Parameters.Add(p);
}
}
catch (Exception ex)
{
Console.WriteLine("Error: {0}", ex);
}
}
}
}
return sq;
}
很難說沒有看到'GetRecordSet'。雖然它使用參數,但它應該是安全的。 – Oded 2012-07-29 18:25:56
更新的問題與更多細節。 – 2012-07-29 18:41:36