Construtores de cadeia de conexão

Aplicável a: .NET Framework .NET .NET Standard

Baixar ADO.NET

Nas versões anteriores do ADO.NET, não existia a verificação de cadeias de conexão com valores de cadeia concatenados no tempo de compilação. Portanto, no tempo de execução, uma palavra-chave incorreta gerava uma ArgumentException. O Provedor de Dados do Microsoft SqlClient para SQL Server inclui a classe de construtor de cadeias de conexão Microsoft.Data.SqlClient.SqlConnectionStringBuilder herdada de DbConnectionStringBuilder.

Ataques de injeção da cadeia de conexão

Um ataque de injeção de cadeia de conexão pode ocorrer quando a concatenação de cadeias dinâmicas é usada para criar cadeias de conexão com base na entrada do usuário. Se a cadeia de caracteres não for validada e os caracteres ou texto mal-intencionado não forem ignorados, um invasor poderá acessar dados confidenciais ou outros recursos no servidor. Por exemplo, um invasor pode montar um ataque inserindo um ponto e vírgula e acrescentando outro valor. A cadeia de conexão é analisada usando um algoritmo "o último ganha", e a entrada hostil é substituída por um valor legítimo.

As classes de construtores de cadeias de conexão são criadas para eliminar hipóteses e proteger contra erros de sintaxe e vulnerabilidades à segurança. Elas fornecem métodos e propriedades correspondentes aos pares chave-valor conhecidos e permitidos pelo provedor de dados. Cada classe mantém uma coleção fixa de sinônimos e pode converter um sinônimo no nome da chave conhecida correspondente. As verificações são feitas para pares válidos de chave/valor e um par inválido gera uma exceção. Além disso, os valores injetados são tratados de forma segura.

O exemplo a seguir demonstra como SqlConnectionStringBuilder trata um valor adicional inserido para a configuração Initial Catalog.

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = "(local)";
builder.IntegratedSecurity = true;
builder.InitialCatalog = "AdventureWorks;NewValue=Bad";
Console.WriteLine(builder.ConnectionString);

A saída mostra que o SqlConnectionStringBuilder o tratou corretamente por meio do escape do valor extra entre aspas duplas em vez de anexá-lo à cadeia de conexão como um novo par chave-valor.

data source=(local);Integrated Security=True;
initial catalog="AdventureWorks;NewValue=Bad"

Compilar cadeias de conexão de arquivos de configuração

Se determinados elementos de uma cadeia de conexão forem conhecidos antecipadamente, eles poderão ser armazenados em um arquivo de configuração e recuperados em tempo de execução para construir uma cadeia de conexão completa. Por exemplo, o nome do banco de dados pode ser conhecido com antecedência, mas não o nome do servidor. Ou talvez você queira que um usuário forneça um nome e uma senha no tempo de execução sem a capacidade de injetar outros valores na cadeia de conexão.

Um dos construtores sobrecarregados de um construtor de cadeias de conexão obtém um String como argumento, o que permite a você fornecer uma cadeia de conexão parcial que depois poderá ser concluída pela entrada do usuário. A cadeia de conexão parcial pode ser armazenada em um arquivo de configuração e recuperada em tempo de execução.

Observação

O namespace System.Configuration permite acesso programático aos arquivos de configuração que usam WebConfigurationManager para aplicativos Web e ConfigurationManager para aplicativos do Windows. Para saber mais sobre como trabalhar com cadeias de conexão e arquivos de configuração, confira Cadeias de conexão e arquivos de configuração.

Exemplo

Este exemplo demonstra como recuperar uma cadeia de conexão parcial de um arquivo de configuração e concluí-la definindo as propriedades DataSource, UserID e Password do SqlConnectionStringBuilder. O arquivo de configuração é definido como a seguir.

<connectionStrings>
  <clear/>
  <add name="partialConnectString"
    connectionString="Initial Catalog=Northwind;"
    providerName="Microsoft.Data.SqlClient" />
</connectionStrings>

Observação

Você deve definir uma referência à System.Configuration.dll em seu projeto para que o código seja executado.

private static void BuildConnectionString(string dataSource,
    string userName, string userPassword)
{
    // Retrieve the partial connection string named databaseConnection
    // from the application's app.config or web.config file.
    ConnectionStringSettings settings =
        ConfigurationManager.ConnectionStrings["partialConnectString"];

    if (null != settings)
    {
        // Retrieve the partial connection string.
        string connectString = settings.ConnectionString;
        Console.WriteLine("Original: {0}", connectString);

        // Create a new SqlConnectionStringBuilder based on the
        // partial connection string retrieved from the config file.
        SqlConnectionStringBuilder builder =
            new SqlConnectionStringBuilder(connectString);

        // Supply the additional values.
        builder.DataSource = dataSource;
        builder.UserID = userName;
        builder.Password = userPassword;
        Console.WriteLine("Modified: {0}", builder.ConnectionString);
    }
}

Confira também