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 サービスのようなサービスがありますか、それともクライアント アプリが DB に直接アクセスしますか?

何らかのプロキシを通過する場合、クライアント上のデータをどれだけサニタイズしても、ハッカーはアプリをバイパスしてサービスにアクセスできます. その場合、Cadeが推奨することを行い、データをたとえばXMLとして、または選択した形式(JSON、バイナリなど)として渡します。次に、実際にコマンドを実行する直前にSQLを構築します。

于 2008-11-16T02:38:58.830 に答える
0

インジェクションを回避するには、データをリモート サーバー (おそらく XML) に送り、リモート サーバー上でデータを適切なデータ型に変換し、パラメーター化されたクエリまたはストアド プロシージャで使用する必要があります。

于 2008-11-16T02:14:01.033 に答える