Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我仍然可以使用sql命令的参数吗?_C#_Sql_Parameters_Sql Injection - Fatal编程技术网

C# 我仍然可以使用sql命令的参数吗?

C# 我仍然可以使用sql命令的参数吗?,c#,sql,parameters,sql-injection,C#,Sql,Parameters,Sql Injection,我正在尝试为构建插入/更新查询生成一个通用代码。到目前为止,我只创建了更新查询,但我对SQL注入有疑问 我的主要目标是尝试创建代码,以减少反复键入相同代码的时间 public SqlConnection SqlConn; private SqlCommand SqlComm; public void UpdateRow(string TableName, string UpdateCondition, List<KeyValuePair<string, string>>

我正在尝试为构建插入/更新查询生成一个通用代码。到目前为止,我只创建了更新查询,但我对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(); } 
}
公共SqlConnection SqlConn;
专用SqlCommand-SqlComm;
public void UpdateRow(字符串表名、字符串更新条件、列表字段和值列表)
{
SqlOpen();
尝试
{
字符串UpdateString=$“更新{TableName}”;
int计数器=0;
foreach(KeyValuePair字段和字段中的值和值列表)
{
如果(计数器>0){UpdateString+=“,”};
UpdateString+=$“SET{FieldAndValue.Key}={FieldAndValue.Value}”;
计数器+=1;
}
if(UpdateCondition.Trim()!=“”){UpdateString+=$”其中{UpdateCondition};“;}
SqlComm=SqlConn.CreateCommand();
SqlComm.CommandText=UpdateString;
SqlComm.ExecuteNonQuery;
}
捕捉{ShowError();}
最后{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);
List UpdateValues=新列表;
Add(新的键值对(“age”,txtAge.text));
UpdateRow(“用户”,“用户id=X”,updateValue);
我正在尝试创建它,所以SQL注入是不可能的

我正在尝试创建它,因此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);
计数器+=1;
其中,
sb
是一个
StringBuilder
(以避免过多的字符串连接)

然而!您计划的
字符串更新条件
本质上是无法解决的。不能使注射变得安全。你需要想出一个更好的方法


或者,更好的方法是:使用任何现成的ORM。

您的代码不安全。使用参数,请参见
List=={“myField”,“123;从表myTable中删除;”--“}
创建的文本将
updatesometable set myField=123;从表myTable中删除;--更新条件
,您将更新
某个表
并清除
我的表
@Ian,我已经怀疑它是否安全。但我不知道怎样才能真正做到安全。此方法使update语句变量的大小在保持update语句变量大小的同时,我正在寻找一种处理参数的方法。@Roberto:例程中的用户输入(即任意的、潜在的恶意字符串)在哪里?是否仅是
列表
?附加说明:
字段和值列表
作为
也可能是一个非常糟糕的主意,除非所有值都是字符串。基本上,这不是处理数据的方法。如果值是一个
浮点数
,请将其作为
浮点数
发送-否则,在转换时可能会遇到很多问题,包括日期格式、数字的不同(国际)表示形式(逗号与句点等)你好,我试试这个。至于情况。它是从实际调用函数的表单硬编码的。所以没有用户输入。@Roberto只是强调:答案的最后一行是我的强烈推荐;在我看来,如果你想重新发明这个东西,你会陷入很多麻烦。我猜我是从错误的角度看的,因为我找不到。但更重要的是,我试图回到C#(2y没有做任何事情,因为我一直在做Delphi)。但我会调查一下的。