Construtores de cadeia de conexão
Aplicável a: .NET Framework .NET .NET Standard
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);
}
}