Share via


Construtores de cadeias de conexão

Em versões anteriores do ADO.NET, a verificação em tempo de compilação de cadeias de conexão com valores de cadeia de caracteres concatenados não ocorria, de modo que, em tempo de execução, uma palavra-chave incorreta gerava um ArgumentExceptionarquivo . Cada um dos provedores de dados do .NET Framework oferecia suporte a sintaxe diferente para palavras-chave de cadeia de conexão, o que dificultava a construção de cadeias de conexão válidas se feita manualmente. Para resolver esse problema, o ADO.NET 2.0 introduziu novos construtores de cadeia de conexão para cada provedor de dados do .NET Framework. Cada provedor de dados inclui uma classe de construtor de cadeia de conexão fortemente tipada que herda de DbConnectionStringBuilder. A tabela a seguir lista os provedores de dados do .NET Framework e suas classes de construtor de cadeia de conexão associadas.

Provider ConnectionStringBuilder classe
System.Data.SqlClient System.Data.SqlClient.SqlConnectionStringBuilder
System.Data.OleDb System.Data.OleDb.OleDbConnectionStringBuilder
System.Data.Odbc System.Data.Odbc.OdbcConnectionStringBuilder
System.Data.OracleClient System.Data.OracleClient.OracleConnectionStringBuilder

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 cadeia de caracteres não for validada e texto ou caracteres mal-intencionados não forem escapados, um invasor poderá acessar dados confidenciais ou outros recursos no servidor. Por exemplo, um invasor pode montar um ataque fornecendo um ponto-e-vírgula e acrescentando um valor adicional. A cadeia de conexão é analisada usando um algoritmo "last one wins" 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. Eles fornecem métodos e propriedades correspondentes aos pares chave/valor conhecidos permitidos por cada provedor 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. As verificações são realizadas para pares de chave/valor válidos e um par inválido lança uma exceção. Além disso, os valores injetados são manuseados de forma segura.

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

Dim builder As New System.Data.SqlClient.SqlConnectionStringBuilder  
builder("Data Source") = "(local)"  
builder("Integrated Security") = True  
builder("Initial Catalog") = "AdventureWorks;NewValue=Bad"  
Console.WriteLine(builder.ConnectionString)  
System.Data.SqlClient.SqlConnectionStringBuilder builder =  
  new System.Data.SqlClient.SqlConnectionStringBuilder();  
builder["Data Source"] = "(local)";  
builder["integrated Security"] = true;  
builder["Initial Catalog"] = "AdventureWorks;NewValue=Bad";  
Console.WriteLine(builder.ConnectionString);  

A saída mostra que o SqlConnectionStringBuilder manipulou isso corretamente, escapando 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"  

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

Se determinados elementos de uma cadeia de conexão forem conhecidos de antemão, 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 antecipadamente, mas não o nome do servidor. Ou você pode querer que um usuário forneça um nome e senha em tempo de execução sem poder injetar outros valores na cadeia de conexão.

Um dos construtores sobrecarregados para um construtor de cadeia de conexão usa um String como um argumento, que permite fornecer uma cadeia de conexão parcial que pode ser concluída a partir da 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.

Nota

O System.Configuration namespace permite acesso programático a arquivos de configuração que usam o WebConfigurationManager para aplicativos Web e o ConfigurationManager para aplicativos 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.

Exemplo

Este exemplo demonstra recuperar uma cadeia de conexão parcial de um arquivo de configuração e completá-la definindo as DataSourcepropriedades , UserIDe Password do SqlConnectionStringBuilder. O arquivo de configuração é definido da seguinte forma.

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

Nota

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

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 (settings != null)
    {
        // Retrieve the partial connection string.
        var 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(connectString)
            {
                // Supply the additional values.
                DataSource = dataSource,
                UserID = userName,
                Password = userPassword
            };
        Console.WriteLine("Modified: {0}", builder.ConnectionString);
    }
}
Private Sub BuildConnectionString(ByVal dataSource As String, _
    ByVal userName As String, ByVal userPassword As String)

    ' Retrieve the partial connection string named databaseConnection
    ' from the application's app.config or web.config file.
    Dim settings As ConnectionStringSettings = _
       ConfigurationManager.ConnectionStrings("partialConnectString")

    If Not settings Is Nothing Then
        ' Retrieve the partial connection string.
        Dim connectString As String = settings.ConnectionString
        Console.WriteLine("Original: {0}", connectString)

        ' Create a new SqlConnectionStringBuilder based on the
        ' partial connection string retrieved from the config file.
        Dim builder As New SqlConnectionStringBuilder(connectString)

        ' Supply the additional values.
        builder.DataSource = dataSource
        builder.UserID = userName
        builder.Password = userPassword

        Console.WriteLine("Modified: {0}", builder.ConnectionString)
    End If
End Sub

Consulte também