SqlParameter不允许表名 - 没有sql注入攻击的其他选项?

时间:2013-07-30 13:00:43

标签: c# sql-server sql-server-2008 sqlparameters sqlparameter

我收到运行时错误"Must declare the table variable "@parmTableName"。不允许在sql语句中将表名作为sql参数。

有没有比允许sql注入攻击更好的选择或建议?我不想为sql语句" DELETE FROM " + tableName + " ";

执行此C#脚本
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();
}

3 个答案:

答案 0 :(得分:10)

寻找白名单。无论如何,表名只能有一组固定的可能的正确值 - 至少,我希望如此。

如果您没有白名单的表名,则可以从字符的白名单开始 - 如果您将其限制为AZ,az和0-9(根本没有标点符号)那应该消除很多关注。 (当然这意味着你不支持奇怪名字的表格......我们在这里并不真正了解你的要求。)

但不,你不能使用表名或列名的参数 - 只能使用值。这通常是数据库中的情况;我不记得看到做了支持参数的那个。 (我敢说当然有一些......)

答案 1 :(得分:6)

正如其他人已经指出你不能在Sql Parameter中使用表名和字段,你可以尝试的一件事是使用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();
}

答案 2 :(得分:-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();
}