Compartilhar via


Construtores de cadeia de conexão

Nas primeiras do ADO.NET, não ocorria a verificação de cadeias de conexão com valores de cadeia de concatenados no tempo de compilação. Portanto, no tempo de execução, uma palavra-chave incorreta gerava uma ArgumentException. Cada provedor de dados do .NET Framework dava suporte a diferentes tipos de sintaxe de palavras-chave de cadeias de conexão, o que dificultava a construção de cadeias de conexão válidas manualmente. Para resolver esse problema, o ADO.NET 2.0 introduziu novos construtores de cadeias de conexão para cada provedor de dados .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 respectivas classes de construtores de cadeias de conexão.

Provedor Classe ConnectionStringBuilder
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 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 o texto mal-intencionado ou os caracteres não forem escapados, um invasor poderá potencialmente acessar dados confidenciais ou outros recursos no servidor. Por exemplo, um invasor pode montar um ataque fornecendo um ponto e vírgula e acrescentando outro valor. A cadeia de conexão é analisada usando o algoritmo "o último vence", 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 que correspondem a pares chave-valor conhecidos e permitidos por cada 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. São realizadas verificações de pares chave/valor válidos e um par inválido gera uma exceção. Além disso, os valores injetados são tratados de maneira segura.

O exemplo a seguir demonstra como SqlConnectionStringBuilder lidar com um valor adicional 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);

Importante

A Microsoft recomenda usar o fluxo de autenticação mais seguro disponível. Se você estiver se conectando ao SQL do Azure, as Identidades gerenciadas para recursos do Azure é o método de autenticação recomendado.

A saída mostra que SqlConnectionStringBuilder tratou esse valor corretamente colocando em uma sequência de escape, entre aspas duplas, o valor adicional, em vez de acrescentá-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.

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 System.Configuration namespace 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.

Confira também