Проблема с загрязнением параметра строки подключения к базе данных

Я разработал инструмент, и когда я запускаю fortify, я получаю 6 критических проблем, связанных со строкой подключения к базе данных, в которой говорится: «Объединение непроверенных входных данных в соединение с базой данных может позволить злоумышленнику переопределить значение параметра запроса. Злоумышленник может быть возможность переопределять существующие значения параметров, вводить новый параметр или использовать переменные вне прямой досягаемости».

 public bool sqlDbValidateUser(string databaseHostname, string databaseName, string databaseUsername, string databasePassword)

    {
        _logger.Info("starting sql DB validation");
        string ConnectionString = "Data Source=" + databaseHostname + "; " +
                    "Initial Catalog=" + databaseName + ";" +
                    "User id=" + databaseUsername + ";" +
                    "Password=" + databasePassword + ";";
        using (SqlConnection connection = new SqlConnection(ConnectionString))
        {
            try
            {
                connection.Open();
                return true;
            }
            catch(Exception)
            {
                return false;
            }
            finally
            {
                if(connection !=null)
                {
                    connection.Close();
                }
            }
        }            

    }

person Raj Singh    schedule 22.08.2019    source источник


Ответы (1)


При работе с базами данных Sql конкатенация строк — чистое зло. Правильный способ сделать то, что вы пытаетесь, заменить этот код:

    string connectionString = "Data Source=" + databaseHostname + "; " +
                          "Initial Catalog=" + databaseName + ";" +
                                  "User id=" + databaseUsername + ";" +
                                 "Password=" + databasePassword + ";";

с этим кодом:

    string connectionString;

    try
    {
        var builder = new SqlConnectionStringBuilder();
        builder.DataSource = databaseHostname;
        builder.InitialCatalog = databaseName;
        builder.UserID = databaseUsername;
        builder.Password = databasePassword;

        connectionString = builder.ToString();
    }
    catch
    {
        return false;
    }
person Click Ok    schedule 28.07.2020