Condividi tramite


Compilatori di stringhe di connessione (ADO.NET)

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 un'eccezione ArgumentException.Poiché ogni provider di dati .NET Framework supporta una sintassi diversa per le parole chiave delle stringhe di connessione, la costruzione manuale di stringhe di connessione valide risulta difficile.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 generatori 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 utilizza 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 tramite un algoritmo basato sul principio che l'ultima occorrenza ha la priorità, pertanto l'input dannoso viene sostituito a un valore lecito.

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.

NotaNota

Lo spazio dei nomi System.Configuration consente l'accesso a livello di codice ai file di configurazione che utilizzano WebConfigurationManager per le applicazioni Web e ConfigurationManager per le applicazioni Windows.Per ulteriori informazioni sull'utilizzo di stringhe di connessione e file di configurazione, vedere Stringhe di connessione e file di configurazione (ADO.NET).

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>
NotaNota

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

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

Vedere anche

Concetti

Privacy e sicurezza dei dati (ADO.NET)

Altre risorse

Stringhe di connessione (ADO.NET)