Condividi tramite


Generatori di stringhe di connessione

Nelle prime versioni 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. Ognuno dei provider di dati .NET Framework supportava una sintassi diversa per le parole chiave delle stringhe di connessione, rendendo complicata la creazione manuale di stringhe di connessione valide. Per risolvere questo problema, in ADO.NET 2.0 sono stati introdotti nuovi generatori di stringhe di connessione per ogni provider di dati .NET Framework. Ogni provider di dati include una classe di generatori di stringhe di connessione fortemente tipizzata che eredita da DbConnectionStringBuilder. Nella tabella seguente sono elencati i provider di dati .NET Framework e le classi di compilatori di stringhe di connessione associate.

Provider 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

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 da ogni 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.

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

Microsoft consiglia di usare il flusso di autenticazione più sicuro disponibile. Se ci si connette ad Azure SQL, le Identità gestite per le risorse Azure sono il metodo di autenticazione consigliato.

Dall'output si rileva che SqlConnectionStringBuilder ha gestito correttamente questa situazione convertendo in caratteri di escape il valore aggiuntivo in virgolette doppie anziché aggiungerlo alla stringa di connessione come 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.

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 app 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).

Vedi anche