如何在 C# 中实现动态数据库选择防注入 SQL

How to make dynamic database selection injection-proof in C# SQL

在尝试使我的代码防注入时,以前的功能区域现在抛出 'Invalid object name' 错误:

static void TestSQL(ref SqlConnection conn)
{
    var dataTable = new DataTable();

    // This line worked
    //var com = new SqlCommand("SELECT * FROM [" + GetDatabaseName() + "].[dbo].[LOCATION]", conn);

    // These throw an error
    var com = new SqlCommand("SELECT * FROM [@databaseName].[dbo].[LOCATION]", conn);
    com.Parameters.AddWithValue("@databaseName", GetDatabaseName());

    using (SqlDataAdapter adapter = new SqlDataAdapter(com))
    {
        adapter.Fill(dataTable); // -- Error occurs here --
    }
}

确切消息是

"Invalid object name '@databaseName.dbo.LOCATION'."

AddWithValue 似乎不喜欢替换该数据库名称,这正是该查询的重点。不知何故 none 我读过的几十个注入线程解决了使数据库动态化的问题。

我怎样才能既能防注入又能保持动态数据库选择的要求?提前致谢!

你为什么不做这样的事情:

var com = new SqlCommand($"SELECT * FROM [{GetDatabaseName()}].[dbo].[LOCATION]", conn);

这适用于 C# 6

否则你可以使用正常的方式:

var com = new SqlCommand("SELECT * FROM [" + GetDatabaseName() + "].[dbo].[LOCATION]", conn);

在创建连接时指定数据库名称,而不是在 SQL