我有一个C#程序,我想动态创建数据库。虽然只有特权用户才会使用此应用程序,但我希望明智地遵循最佳实践。我该怎么做呢?我认为在这种情况下我不能使用参数化查询,因为我不想传入字符串,我想传入一个标识符。
这是我现在作为占位符进入的不安全方式:
using (MySqlConnection connection = new MySqlConnection(connectionString))
using (MySqlCommand command = connection.CreateCommand())
{
connection.Open();
command.CommandText = "DROP SCHEMA IF EXISTS " + schema;
command.ExecuteNonQuery();
command.CommandText = "CREATE SCHEMA " + schema;
command.ExecuteNonQuery();
}
有关于此的任何想法吗?
答案 0 :(得分:1)
您可以使用反引号分隔符来确保正确引用字符串,并确保将用户输入的内容用作文字标识符。
请参阅:http://dev.mysql.com/doc/refman/5.0/en/identifiers.html和Using backticks around field names
这样传递给服务器的命令看起来像:“DROP SCHEMA IF EXISTS foo
”,它将容忍使用保留字和其他不正确的字符串值作为标识符。
答案 1 :(得分:0)
只需针对模式运行正则表达式来验证它是否是有效名称? (不包含空格,冒号等)。在这种情况下,我不确定您是否可以使用参数化查询,但如果这样做,则无法创建名为TRANCATE TABLE的数据库用户;无论如何:)
答案 2 :(得分:0)
我不知道你为什么要动态创建数据库,但我认为这样做的正确方法不是动态生成数据库。
我能想到的唯一例外是你是否在创建自己的数据库管理系统。如果是这种情况,也许您可以查看一些开源MySQL数据库管理器的源代码,如phpMyAdmin。 (我不知道.Net的任何内容。)