我仍然可以对sql命令使用参数吗?

时间:2019-06-07 08:20:48

标签: c# sql parameters sql-injection

我正在尝试创建用于构建插入/更新查询的通用代码。到目前为止,我只创建了Update查询,但是考虑到SQL注入,我一直对此表示怀疑。

我的主要目标是尝试创建代码,以减少一遍又一遍地重新键入相同代码的时间。

public SqlConnection SqlConn;
private SqlCommand SqlComm;

public void UpdateRow(string TableName, string UpdateCondition, List<KeyValuePair<string, string>> FieldAndValueList)
{
  SqlOpen();
  try
  {
    string UpdateString = $"UPDATE {TableName} ";
    int counter = 0;
    foreach (KeyValuePair<string, string> FieldAndValue in FieldAndValueList)
    {
      if (counter > 0) { UpdateString += "," };
      UpdateString += $"SET {FieldAndValue.Key} = {FieldAndValue.Value} ";
      Counter += 1;
    }
    if (UpdateCondition.Trim() != "") { UpdateString += $"WHERE {UpdateCondition};"; }
    SqlComm = SqlConn.CreateCommand();
    SqlComm.CommandText = UpdateString;
    SqlComm.ExecuteNonQuery;
  }
  catch { ShowError(); }
  finally { SqlClose(); } 
}

然后将像这样执行:

List<KeyValuePair<string, string>> UpdateValues = new List<KeyValuePair<string, string>>;
UpdateValues.Add(new KeyValuePair<string, string>("age", txtAge.text)); 
UpdateRow("user", "user_id = X", UpdateValues);

我正在尝试创建它,因此无法进行SQL注入。

1 个答案:

答案 0 :(得分:3)

  

我正在尝试创建它,因此无法进行SQL注入。

然后您必须使用参数;对于单个字段,将执行以下操作:

if (counter > 0) { sb.Append(","); }
var pName = "@p" + counter.ToString();
sb.Append("[").Append(FieldAndValue.Key).Append("]=").Append(pName);
cmd.Parameters.AddWithValue(pName, ((object)FieldAndValue.Value) ?? DBNull.Value);
Counter += 1;

其中sbStringBuilder(以避免过多的字符串连接)

但是!您计划的string UpdateCondition本质上是无法解决的。不能将 设为注射安全。您需要考虑一种更好的方法。

或者更好:使用任何现成的ORM。