Construtores de cadeias de ligação

Aplica-se a: .NET Framework .NET .NET Standard

Baixar ADO.NET

Em versões anteriores do ADO.NET, a verificação em tempo de compilação das cadeias de ligação com valores de cadeia concatenados não ocorria, de modo que, em tempo de execução, uma palavra-chave incorreta gerava um ArgumentException. O Microsoft SqlClient Data Provider para SQL Server inclui a classe Microsoft.Data.SqlClient.SqlConnectionStringBuilder cadeia de ligação builder que herda de DbConnectionStringBuilder.

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

Um ataque de injeção de cadeia de conexão pode ocorrer quando a concatenação dinâmica de cadeia de caracteres é usada para criar cadeias de conexão baseadas na entrada do usuário. Se a sequência não for validada e os caracteres ou texto malicioso não forem escapados, um atacante pode potencialmente aceder a dados sensíveis ou a outros recursos no servidor. Por exemplo, um atacante pode montar um ataque inserindo um ponto e vírgula e acrescentando outro valor. A cadeia de ligação é analisada usando um algoritmo "o último vence", e a entrada hostil é substituída por um valor legítimo.

As classes do construtor de cadeias de conexão são projetadas para eliminar suposições e proteger contra erros de sintaxe e vulnerabilidades de segurança. Fornecem métodos e propriedades correspondentes aos pares chave/valor conhecidos permitidos pelo fornecedor de dados. Cada classe mantém uma coleção fixa de sinônimos e pode traduzir de um sinônimo para o nome de chave bem conhecido correspondente. São feitas verificações para pares chave/valor válidos e um par inválido lança uma exceção. Além disso, os valores injetados são tratados de forma segura.

O exemplo seguinte demonstra como o SqlConnectionStringBuilder lida com um valor extra 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 tratou disso corretamente ao escapar o valor extra entre aspas duplas em vez de o adicionar à string de conexão como um novo par chave/valor.

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

Criar cadeias de conexão a partir de arquivos de configuração

Se certos elementos de uma cadeia de ligação forem conhecidos de antemão, podem ser armazenados num ficheiro de configuração e recuperados em tempo de execução para construir uma cadeia de ligação completa. Por exemplo, o nome do banco de dados pode ser conhecido antecipadamente, mas não o nome do servidor. Ou pode querer que o utilizador forneça um nome e uma palavra-passe em tempo de execução sem a possibilidade de injetar outros valores na cadeia de ligação.

Um dos construtores sobrecarregados de um construtor de cadeias de ligação aceita um String como argumento, o que lhe permite fornecer uma cadeia de ligação parcial que pode depois ser completada a partir da entrada do utilizador. A cadeia de ligação parcial pode ser armazenada num ficheiro de configuração e recuperada em tempo de execução.

Observação

O System.Configuration espaço de nomes permite acesso programático a ficheiros de configuração que utilizam o WebConfigurationManager para aplicações Web e o ConfigurationManager para aplicações Windows. Para obter mais informações sobre como trabalhar com cadeias de conexão e arquivos de configuração, consulte Cadeias de conexão e arquivos de configuração.

Example

Este exemplo demonstra como recuperar uma string de conexão parcial de um ficheiro de configuração e completá-la definindo as DataSource, UserID e Password propriedades de SqlConnectionStringBuilder. O ficheiro de configuração é definido da seguinte forma.

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

Observação

Tens de definir uma referência para o System.Configuration.dll no teu 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);
    }
}