12

我正在使用 C# 和 .NET 3.5。我需要生成并存储一些 T-SQL 插入语句,这些语句稍后将在远程服务器上执行。

例如,我有一个员工数组:

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 创建插入语句的代码,但这感觉不对。我考虑使用 SqlCommand (希望做这样的事情),但它没有提供将命令文本与参数组合的方法。

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

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

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

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

4

5 回答 5

19

像这样创建您的 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();
于 2008-11-16T00:09:34.047 回答
8

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

只要您从不将数据视为代码,就应该没问题。

于 2008-11-16T00:06:59.497 回答
4

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

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

干杯!

于 2012-05-31T02:57:34.090 回答
1

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

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

于 2008-11-16T02:38:58.830 回答
0

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

于 2008-11-16T02:14:01.033 回答