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

fle*_*sod 2 c# sql-server sql-server-2008 sqlparameter

我收到运行时错误说"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();
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 10

去寻找白名单.只能有一组固定的可能反正表名正确的价值观-至少,所以我希望.

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

但不,您不能将参数用于表名或列名 - 仅限值.这通常是数据库中的情况; 我不记得看到其中一个做了支护参数为.(我敢说有一些,当然......)

  • 你是关于白名单的.不好的方面是长期不断添加表名,重新/部署.这将是一个麻烦和不可持续的.但是你让我思考.用正确的想法进行Google搜索非常困难.但最后我在http://stackoverflow.com/questions/14003241/must-declare-the-table-variable-table找到了它.请参阅接受的答案&@ RafaelAdel的评论."是的.你应该检查tblname是否是数据库中的表(SELECT*FROM INFORMATION_SCHEMA.TABLES)." 我可以使用"WHERE Table_Name = @parmTableName",如果它存在,使用它! (3认同)

Hab*_*bib 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();
}
Run Code Online (Sandbox Code Playgroud)

  • @fletchsod,你能给我一个例子,它会如何导致SQL注入? (3认同)
  • 这仍然可能导致 SQL 注入攻击。我们能想到的一切仍然可以在脚本中留下漏洞(或漏洞)。:-) (2认同)