C#和SQL参数以防止注入

时间:2012-12-05 20:56:13

标签: c# .net sql data-access-layer sqlparameters

我想知道(在下面的代码中),我确保dataID是下面传递的参数中的文本(或varchar或int)?

public T ExecuteQuery<T>(Func<IDataReader, T> getResult, string query, params IDataParameter[] parameters)
    {
        using (SqlConnection conn = new SqlConnection(this.DefaultConnectionString))
        {
            conn.Open();

            // Declare the parameter in the query string
            using (SqlCommand command = new SqlCommand(query, conn))
            {
                foreach (var parameter in parameters)
                {
                    command.Parameters.Add(parameter);
                }

                command.Prepare();

                using (SqlDataReader dr = command.ExecuteReader())
                {
                    return getResult(dr);
                }
            }
        }
    }

    public string GetMySpecId(string dataId)
    {
        return ExecuteQuery(
            dr =>
            {
                if (dr.Read())
                {
                    return dr[0].ToString();
                }

                return string.Empty;
            },
            "select specId from MyTable where dataId = @dataId",
            new SqlParameter("dataId", dataId));
    }

我习惯于这样编码:

command.Parameters.Add(new SqlParameter("key", SqlDbType.Text));

command.Prepare();

command.Parameters[0].Value = dataId;

如何在顶部的代码中将两个或多个参数传递给ExecuteQuery?

2 个答案:

答案 0 :(得分:2)

ExecuteQuery已经有多个参数。它是ParamArray,这意味着它需要任意数量的参数并将它们转换为数组。

例如,如果我有这样的函数:

public int Sum(params int[] numbersToSum) { ... }

我可以这样称呼它:

Sum(1, 2, 5, 6, 1)

在您的情况下,您可以这样称呼它:

ExecuteQuery(
   dr => { //snip }, 
   query,
   new SqlParameter("dataId", dataId),
   new SqlParameter("anotherParm", parm2),
   new SqlParameter("anotherParm", parm3),
   ... );

答案 1 :(得分:1)

代码使用params关键字,因此您似乎应该编写其他转义SQL并将参数附加到方法的末尾。以下是使用代码作为基础的示例。

该链接提供了更全面的解释,但params使得您可以在方法签名结尾处拥有可变数量的参数(只要它们是相同的类型)。它将落在此params变量中的所有最终参数放入数组中。

 return ExecuteQuery(
        dr =>
        {
            if (dr.Read())
            {
                return dr[0].ToString();
            }

            return string.Empty;
        },
        "select specId from MyTable where dataId = @dataId and somethingelse = @else",
        new SqlParameter("dataId", dataId), 
        new SqlParameter("else", elseVar);