【问题标题】:How do I securely create a mysql database in C#如何在 C# 中安全地创建 mysql 数据库
【发布时间】:2010-08-23 20:35:25
【问题描述】:

我有一个 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();
        }

对此有什么想法吗?

【问题讨论】:

  • 能否请您发布您的连接字符串?供参考
  • 没有。连接字符串成功连接到数据库。我对上面的代码没有任何问题。我只是在问是否有更好的方法。

标签: c# mysql security


【解决方案1】:

您可以使用反引号分隔符来确保正确引用字符串并确保用户输入的任何内容都用作文字标识符。

见:http://dev.mysql.com/doc/refman/5.0/en/identifiers.htmlUsing backticks around field names

这样,传递给服务器的命令看起来像:“DROP SCHEMA IF EXISTS foo”,它允许使用保留字和其他不正确的字符串值作为标识符。

【讨论】:

    【解决方案2】:

    简单地对模式运行正则表达式来验证它是一个有效的名称? (不包含空格、冒号等)。我不确定在这种情况下您是否可以使用参数化查询,但如果这样做,它将无法创建一个名为 TRANCATE TABLE 用户的数据库;无论如何:)

    【讨论】:

    • 所以您的建议是要非常小心?我想那会奏效。我希望有一种行业标准的做事方式。
    • 是的,与任何用户输入一样,根据一组规则对其进行验证以确保其有效。
    【解决方案3】:

    我不知道为什么要动态创建数据库,但是我认为这样做的正确方法是不要动态生成数据库。

    我能想到的唯一例外是您正在创建自己的数据库管理系统。如果是这样的话,也许你可以看看一些开源 MySQL 数据库管理器的源代码,比如 phpMyAdmin。 (我不知道.Net。)

    【讨论】:

    • 我想要动态创建数据库的原因是因为我正在编写一个多租户应用程序,并且我希望允许应用程序的管理员能够即时配置新客户没有我的干预。话虽如此,除了根据请求动态创建数据库之外,您还有更好的方法吗?
    猜你喜欢
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 2023-03-23
    • 2012-03-09
    • 2016-07-14
    • 2010-09-20
    • 1970-01-01
    相关资源
    最近更新 更多