我有以下功能:
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方法解析查询参数,查找以@开头的单词,并创建传递给SqlCommand对象的相应SqlParameter对象。在这种情况下,将创建两个参数。
查询参数将始终由我提供,参数数组可能包含来自用户的数据。
我担心因为我正在从字符串生成参数名称,所以我可能会在某种程度上无意中绕过反SQL注入对策。这种方法安全吗?
更新: GetRecordSet获取一个select命令,如下所示:
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;
}
答案 0 :(得分:0)
上面的代码对于SQL注入是安全的 - 有一种方法可以利用parameter names,但是这段代码可以安全地解决这个问题。
当然,没有办法100%肯定,但这是最好的。
答案 1 :(得分:0)
没有。从外部世界传递参数的唯一方法是明确的 确定或适当引用。只插入任何文本块是绝对不安全的 查询。