C# 我仍然可以使用sql命令的参数吗?
我正在尝试为构建插入/更新查询生成一个通用代码。到目前为止,我只创建了更新查询,但我对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>>
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)。但我会调查一下的。