从数据库返回值的通用C#函数
下面的函数从SQLServer表中获取参数并返回第一个值。它是通用的,很容易获得一个值,但它有SQL注入的安全漏洞。是否有人可以帮助修改代码,使其成为参数化的或任何其他方式来保护SQL注入从数据库返回值的通用C#函数,c#,sql-server,C#,Sql Server,下面的函数从SQLServer表中获取参数并返回第一个值。它是通用的,很容易获得一个值,但它有SQL注入的安全漏洞。是否有人可以帮助修改代码,使其成为参数化的或任何其他方式来保护SQL注入 public static string getFieldValue(string tableName, string returnField, string whereCondition) { SqlConnection con = new SqlConnection
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();可以在删除后删除记录;第一句话的开头。“我已经测试了注射。”肖恩·兰格说得完全正确