从数据库返回值的通用C#函数

从数据库返回值的通用C#函数,c#,sql-server,C#,Sql Server,下面的函数从SQLServer表中获取参数并返回第一个值。它是通用的,很容易获得一个值,但它有SQL注入的安全漏洞。是否有人可以帮助修改代码,使其成为参数化的或任何其他方式来保护SQL注入 public static string getFieldValue(string tableName, string returnField, string whereCondition) { SqlConnection con = new SqlConnection

下面的函数从SQLServer表中获取参数并返回第一个值。它是通用的,很容易获得一个值,但它有SQL注入的安全漏洞。是否有人可以帮助修改代码,使其成为参数化的或任何其他方式来保护SQL注入

public static string getFieldValue(string tableName, string returnField, string whereCondition)
        {
            SqlConnection con = new SqlConnection(Utilities.ConnectionString());
            SqlDataReader reader;
            string returnValue;
        try
        {
            string sql;
            if (whereCondition != "")
                sql = "SELECT " + returnField + " as ReturnField FROM " + tableName + " WHERE " + whereCondition;
            else
                sql = "SELECT " + returnField + " as ReturnField FROM " + tableName;


            SqlCommand cmd = new SqlCommand(sql, con);

            con.Open();
            reader = cmd.ExecuteReader();

            if (reader.Read())
            {
                returnValue = reader["ReturnField"].ToString();
                reader.Close();
                return returnValue;
            }
            else
            {
                reader.Close();
                return "";
            }
        }
        catch (Exception err)
        {
            throw new ApplicationException(err.Message);
        }
        finally
        {

            con.Close();
            con.Dispose();
        }
}

这实际上应该没问题,因为它只使用cmd.ExecuteReader()。任何调用都不能插入、更新或删除,对吗?您不能参数化表名或列名。您可以使用QUOTENAME来包装列名和表名,这非常有帮助。问题是您正试图创建一个通用方法来查询任何表中的任何列。这就像创建“一种方法来统治所有人”。@B先生,这绝对不行!!!它对sql注入非常开放。仅仅因为方法名是ExecuteReader并不能保证安全。在sql端,它只执行传入的字符串,该字符串可以包含多个语句。cmd.ExecuteReader();可以在删除后删除记录;第一句话的开头。我已经测试了注入。@Sean Lange完全正确这实际上应该没问题,因为它只使用cmd.ExecuteReader()。任何调用都不能插入、更新或删除,对吗?您不能参数化表名或列名。您可以使用QUOTENAME来包装列名和表名,这非常有帮助。问题是您正试图创建一个通用方法来查询任何表中的任何列。这就像创建“一种方法来统治所有人”。@B先生,这绝对不行!!!它对sql注入非常开放。仅仅因为方法名是ExecuteReader并不能保证安全。在sql端,它只执行传入的字符串,该字符串可以包含多个语句。cmd.ExecuteReader();可以在删除后删除记录;第一句话的开头。“我已经测试了注射。”肖恩·兰格说得完全正确