如何在 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
在尝试使我的代码防注入时,以前的功能区域现在抛出 '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