6

というランタイム エラーが発生しました"Must declare the table variable "@parmTableName"。つまり、sql-statement の sql パラメータとしてテーブル名を持つことは許可されていません。

SQL インジェクション攻撃を許可するよりも良いオプションや提案はありますか? SQL ステートメントに対してこの C# スクリプトを実行したくありません" DELETE FROM " + tableName + " "

using(var dbCommand = dbConnection.CreateCommand())
{
   sqlAsk = "";
   sqlAsk += " DELETE FROM @parmTableName ";
   sqlAsk += " WHERE ImportedFlag = 'F' ";

   dbCommand.Parameters.Clear();
   dbCommand.Parameters.AddWithValue("@parmTableName", tableName);

   dbConnection.Open();

   rowAffected = dbCommand.ExecuteNonQuery();
}
4

3 に答える 3

10

ホワイトリストを探してください。とにかく、テーブル名の可能な正しい値の固定セットしか存在できません-少なくとも、そう願っています。

テーブル名のホワイト リストがない場合は、文字のホワイト リストから始めることができます。文字を AZ、az、および 0-9 (句読点をまったく使用しない) に制限すると、多くの懸念が取り除かれます。(もちろん、これは奇妙な名前のテーブルをサポートしていないことを意味します...ここでの要件はよくわかりません。)

ただし、テーブル名または列名にパラメーターを使用することはできません。値のみです。これは通常、データベースの場合です。そのためのパラメーターをサポートしていたものを見た覚えがありません。(もちろん、いくつかあると思います...)

于 2013-07-30T13:04:57.027 に答える
8

As others have already pointed out that you can't use Table Name and Fields in Sql Parameter, one thing that you can try is to escape table name using SqlCommandBuilder, like:

string tableName = "YourTableName";
var builder = new SqlCommandBuilder();
string escapedTableName = builder.QuoteIdentifier(tableName);

using (var dbCommand = dbConnection.CreateCommand())
{
    sqlAsk = "";
    sqlAsk += " DELETE FROM " + escapedTableName; //concatenate here
    sqlAsk += " WHERE ImportedFlag = 'F' "; 

    dbCommand.Parameters.Clear();

    dbConnection.Open();

    rowAffected = dbCommand.ExecuteNonQuery();
}
于 2013-07-30T13:13:12.350 に答える