Generatori di stringhe di connessione

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

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"  

Compilazione di 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 avere 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="System.Data.SqlClient" />  
</connectionStrings>  

Nota

È necessario impostare un riferimento a System.Configuration.dll nel progetto affinché il codice venga eseguito.

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 (settings != null)
    {
        // Retrieve the partial connection string.
        var 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(connectString)
            {
                // Supply the additional values.
                DataSource = dataSource,
                UserID = userName,
                Password = userPassword
            };
        Console.WriteLine("Modified: {0}", builder.ConnectionString);
    }
}
Private Sub BuildConnectionString(ByVal dataSource As String, _
    ByVal userName As String, ByVal userPassword As String)

    ' Retrieve the partial connection string named databaseConnection
    ' from the application's app.config or web.config file.
    Dim settings As ConnectionStringSettings = _
       ConfigurationManager.ConnectionStrings("partialConnectString")

    If Not settings Is Nothing Then
        ' Retrieve the partial connection string.
        Dim connectString As String = settings.ConnectionString
        Console.WriteLine("Original: {0}", connectString)

        ' Create a new SqlConnectionStringBuilder based on the
        ' partial connection string retrieved from the config file.
        Dim builder As New SqlConnectionStringBuilder(connectString)

        ' Supply the additional values.
        builder.DataSource = dataSource
        builder.UserID = userName
        builder.Password = userPassword

        Console.WriteLine("Modified: {0}", builder.ConnectionString)
    End If
End Sub

Vedi anche