3

create ステートメントの sql インジェクションを防ぐことは理にかなっていますか? どうすればこれを行うことができますか?コマンド パラメーターを使用したかったのですが、うまくいきません。

例:

var createSql = "CREATE TABLE @TableName (@Column1 ...)";
var command = new SqlCommand();

command.CommandText = createSql;
command.Parameters.AddWithValue("@TableName", "XYZ");
command.Parameters.AddWithValue("@Column1", "Col");

// somewhere else
command.Connection = connection;
command.ExecuteNonReader(); // --> exception: invalid syntax at @TableName

編集: Column と TableNames は、他のデータに応じて生成されます。ユーザー入力でも間接的に、はい。指定された作成ステートメントは不完全です。これはほんの一例です。

私の問題は、コマンド パラメーターが置き換えられていないように見えることです。

4

2 に答える 2

2

テーブル名または列名にバインド変数を使用することはできません。

そのため、文字列の連結と、必要に応じて手動の引用符/エスケープを使用してその SQL ステートメントを作成する必要があります。

ユーザーが直接入力するのは非常に危険ですが、自動生成された名前のオプションを選択するなど、間接的なものであれば問題ありません。

于 2013-08-21T09:27:43.553 に答える