Partilhar via


Construtores de cadeias de conexão

Nas primeiras versões 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 gera uma exceção. Além disso, os valores injetados são manuseados de forma segura.

O exemplo a seguir demonstra como 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);

Importante

A Microsoft recomenda que você use 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 serão o método de autenticação recomendado.

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"

Criar 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.

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 para aplicativos Windows ConfigurationManager . 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.

Consulte também