Generatori di stringhe di connessione
Si applica a: .NET Framework .NET .NET Standard
Nelle versioni precedenti di ADO.NET il controllo in fase di compilazione delle stringhe di connessione con valori di stringhe concatenate non veniva eseguito, quindi in fase di esecuzione una parola chiave non corretta avrebbe generato una ArgumentException. Il provider di dati Microsoft SqlClient per SQL Server comprende la classe del generatore di stringhe di connessione Microsoft.Data.SqlClient.SqlConnectionStringBuilder che eredita da DbConnectionStringBuilder.
Attacchi injection alle stringhe di connessione
Un attacco injection alle stringhe di connessione può verificarsi quando si usa la concatenazione dinamica di stringhe per compilare stringhe di connessione basate sull'input dell'utente. Se la stringa non viene convalidata e il testo o i caratteri dannosi non vengono convertiti in caratteri di escape, un utente non autorizzato potrebbe accedere a dati sensibili o ad altre risorse del server. Ad esempio, un utente non autorizzato potrebbe eseguire un attacco specificando un punto e virgola e aggiungendo un altro valore. La stringa di connessione viene analizzata usando un algoritmo "priorità all'ultimo" e l'input ostile viene sostituito con un valore legittimo.
Le classi di generatori di stringhe di connessione sono progettate per eliminare la necessità di basarsi su congetture e proteggersi da errori di sintassi e vulnerabilità della sicurezza. Forniscono metodi e proprietà che corrispondono alle coppie chiave/valore note consentite dal provider di dati. Ogni classe mantiene una raccolta fissa di sinonimi e può essere convertita da un sinonimo al nome di chiave noto. Vengono eseguiti controlli per rilevare coppie chiave/valore valide e le coppie non valide generano un'eccezione. Inoltre, i valori inseriti vengono gestiti in modo sicuro.
Nell'esempio seguente viene illustrata la modalità con cui SqlConnectionStringBuilder gestisce un valore aggiuntivo inserito per l'impostazione Initial Catalog
.
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = "(local)";
builder.IntegratedSecurity = true;
builder.InitialCatalog = "AdventureWorks;NewValue=Bad";
Console.WriteLine(builder.ConnectionString);
L'output mostra che SqlConnectionStringBuilder ha gestito correttamente tale inserimento eseguendo l'escape del valore aggiuntivo racchiuso tra virgolette doppie anziché aggiungerlo alla stringa di connessione quale nuova coppia chiave/valore.
data source=(local);Integrated Security=True;
initial catalog="AdventureWorks;NewValue=Bad"
Creare stringhe di connessione da file di configurazione
Se determinati elementi di una stringa di connessione sono noti in anticipo, possono essere archiviati in un file di configurazione e recuperati in fase di esecuzione per costruire una stringa di connessione completa. Ad esempio, è possibile che il nome del database sia noto in anticipo, ma non il nome del server. Oppure è possibile che si desideri che un utente specifichi un nome utente e una password in fase di esecuzione senza la possibilità di inserire altri valori nella stringa di connessione.
Uno dei costruttori di overload per un generatore di stringhe di connessione accetta String come argomento, consentendo di specificare una stringa di connessione parziale che può essere quindi completata dall'input dell'utente. La stringa di connessione parziale può essere archiviata in un file di configurazione e recuperata in fase di esecuzione.
Nota
Lo spazio dei nomi System.Configuration consente l'accesso a livello di codice ai file di configurazione che usano WebConfigurationManager per le applicazioni Web e ConfigurationManager per le applicazioni Windows. Per altre informazioni sull'utilizzo delle stringhe di connessione e dei file di configurazione, vedere Connection Strings and Configuration Files (Stringhe di connessione e file di configurazione).
Esempio
In questo esempio vengono illustrati il recupero di una stringa di connessione da un file di configurazione e il relativo completamento tramite l'impostazione delle proprietà DataSource, UserID e Password di SqlConnectionStringBuilder. Il file di configurazione viene definito come segue.
<connectionStrings>
<clear/>
<add name="partialConnectString"
connectionString="Initial Catalog=Northwind;"
providerName="Microsoft.Data.SqlClient" />
</connectionStrings>
Nota
È necessario impostare un riferimento a System.Configuration.dll
nel progetto affinché il codice venga eseguito.
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);
}
}