6

我得到一个运行时错误说"Must declare the table variable "@parmTableName"。这意味着不允许在 sql 语句中将表名作为 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

正如其他人已经指出的那样,您不能在 Sql 参数中使用表名和字段,您可以尝试的一件事是使用SqlCommandBuilder转义表名,例如:

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 回答
-4

(sqlAsk 是字符串,对吗?)如果它是正确的,那么让我们试试这个:

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

   string table_name = "Your table name here";  //<- fill this as u need 
   sqlAsk = sqlAsk.Replace("<table_name>", table_name); // it will replace <table_name> text to string table_name

   dbConnection.Open();

   rowAffected = dbCommand.ExecuteNonQuery();
}
于 2015-01-19T11:35:25.503 回答