我正在使用C#和.NET 3.5。我需要生成并存储一些稍后将在远程服务器上执行的T-SQL插入语句。
例如,我有一组Employees:
new Employee[]
{
new Employee { ID = 5, Name = "Frank Grimes" },
new Employee { ID = 6, Name = "Tim O'Reilly" }
}
我需要最终得到一个字符串数组,如下所示:
"INSERT INTO Employees (id, name) VALUES (5, 'Frank Grimes')",
"INSERT INTO Employees (id, name) VALUES (6, 'Tim O''Reilly')"
我正在查看一些使用String.Format创建insert语句的代码,但这感觉不对。我考虑使用SqlCommand(希望做something like this),但它没有提供将命令文本与参数组合的方法。
仅仅替换单引号并构建字符串是否足够?
string.Format("INSERT INTO Employees (id, name) VALUES ({0}, '{1}')",
employee.ID,
replaceQuotes(employee.Name)
);
这样做时我应该关注什么?源数据相当安全,但我不想做太多假设。
编辑:只想指出在这种情况下,我没有SqlConnection或任何方式直接连接到SQL Server。这个特殊的应用程序需要生成sql语句并将它们排队等待在其他地方执行 - 否则我将使用SqlCommand.Parameters.AddWithValue()答案 0 :(得分:17)
像这样创建你的SqlCommand对象:
SqlCommand cmd = new SqlCommand(
"INSERT INTO Employees (id, name) VALUES (@id, @name)", conn);
SqlParameter param = new SqlParameter();
param.ParameterName = "@id";
param.Value = employee.ID;
cmd.Parameters.Add(param);
param = new SqlParameter();
param.ParameterName = "@name";
param.Value = employee.Name;
cmd.Parameters.Add(param);
cmd.ExecuteNonQuery();
答案 1 :(得分:7)
使用参数化命令。将参数传递给远程服务器,然后调用SQL Server,仍然保持SQL本身和参数值之间的区别。
只要您从未将处理数据混合为代码,您就可以了。
答案 2 :(得分:4)
以这种方式修复替换引号:
void string replaceQuotes(string value) {
string tmp = value;
tmp = tmp.Replace("'", "''");
return tmp;
}
干杯!
答案 3 :(得分:1)
嗯,我同意其他所有人你应该使用参数化查询,并将其留在那。但是如何将这些sql语句传递给远程服务器?您是否有某种类型的服务,如接受和执行任意Sql命令的Web服务,或者您的客户端应用程序是否会直接访问数据库?
如果您通过某种代理,那么无论您在客户端清理多少数据,黑客都可以绕过您的应用并点击该服务。在这种情况下,执行Cade推荐的内容并将数据作为XML传递,例如您选择的任何格式(JSON,Binary等)。然后在实际运行命令之前构建SQL。
答案 4 :(得分:0)
为了避免注入,您需要将数据发送到远程服务器(可能是XML),然后在远程服务器上,数据应该转换回适当的数据类型并用于参数化查询或存储过程。