将安全的SQL语句创建为字符串

我正在使用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(希望做这样的事情 ),但它没有提供将命令文本与参数组合的方法。

仅仅替换单引号并构建字符串就足够了吗?

 string.Format("INSERT INTO Employees (id, name) VALUES ({0}, '{1}')", employee.ID, replaceQuotes(employee.Name) ); 

这样做时我应该关注什么? 源数据相当安全,但我不想做太多假设。

编辑:只是想指出在这种情况下,我没有SqlConnection或任何方式直接连接到SQL Server。 这个特殊的应用程序需要生成sql语句并将它们排队等待在其他地方执行 – 否则我将使用SqlCommand.Parameters.AddWithValue()

使用参数化命令。 将参数传递给远程服务器,然后调用SQL Server,仍然保持SQL本身和参数值之间的区别。

只要您从不将处理数据作为代码混合,您应该没问题。

像这样创建您的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(); 

以这种方式修复替换引号function:

 void string replaceQuotes(string value) { string tmp = value; tmp = tmp.Replace("'", "''"); return tmp; } 

干杯!

嗯我同意其他人你应该使用参数化查询,并将其留在那。 但是如何将这些sql语句传递给远程服务器? 您是否有某种类型的服务,如Web服务,它将接受并执行任意Sql命令,或者您的客户端应用程序是否会直接命中数据库?

如果您通过某种代理,那么无论您在客户端上清理多少数据,黑客都可以绕过您的应用并点击该服务。 在这种情况下,执行Cade建议并以XML格式传递数据或您选择的任何格式(JSON,Binary等)。然后在实际运行命令之前构建SQL。

为避免注入,您需要将数据发送到远程服务器(可能是XML),然后在远程服务器上,数据应转换回适当的数据类型并用于参数化查询或存储过程。