gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:33:04 25 4
gpt4 key购买 nike

我正在尝试编写用于构建插入/更新查询的通用代码。到目前为止,我只创建了更新查询,但考虑到 SQL 注入(inject)我有疑问。

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

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 注入(inject)。

最佳答案

I'm trying to create it so SQL injection is not possible.

那么你必须使用参数;对于各个字段,可以使用类似以下的内容:

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;

其中 sb 是一个 StringBuilder(以避免太多的字符串连接)

但是!您计划的 string UpdateCondition 本质上是无法解决的。这不能是注入(inject)安全的。您需要想出更好的方法。

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

关于c# - 我仍然可以使用 sql 命令的参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56490571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com