1

我有以下功能:

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

2 回答 2

1

上面的代码对 SQL 注入是安全的 - 有一种方法可以利用参数名称,但是这段代码对这个特定问题是安全的。

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

于 2012-07-29T18:44:14.440 回答
0

否。从外部世界传递参数的唯一方法是明确标识或正确引用。将任何文本块插入到查询中是绝对不安全的。

于 2012-07-29T19:05:35.027 回答