这个方法是否从SQL注入返回DataTable安全?

时间:2012-07-29 18:23:51

标签: c#-4.0

我有以下功能:

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;
}

2 个答案:

答案 0 :(得分:0)

上面的代码对于SQL注入是安全的 - 有一种方法可以利用parameter names,但是这段代码可以安全地解决这个问题。

当然,没有办法100%肯定,但这是最好的。

答案 1 :(得分:0)

没有。从外部世界传递参数的唯一方法是明确的 确定或适当引用。只插入任何文本块是绝对不安全的 查询。