Partager via


Générateurs de chaînes de connexion

S'applique à : .NET Framework .NET .NET Standard

Télécharger ADO.NET

Les versions précédentes d’ADO.NET ne prenaient pas en charge la vérification au moment de la compilation des chaînes de connexion avec des valeurs de chaînes concaténées, ainsi, pendant le temps d’exécution, un mot clé non correct générait un ArgumentException. Le Fournisseur de données Microsoft SqlClient pour SQL Server comprend la classe du générateur de chaînes de connexion Microsoft.Data.SqlClient.SqlConnectionStringBuilder qui hérite de DbConnectionStringBuilder.

Attaques par injection de chaîne de connexion

Une attaque par injection de chaîne de connexion peut se produire lorsqu'une concaténation de chaîne dynamique est utilisée pour générer des chaînes de connexion se basant sur l'entrée d'utilisateur. Si la chaîne n’est pas validée et que du texte ou des caractères malveillants ne sont pas placés dans une séquence d’échappement, une personne malveillante peut accéder potentiellement à des données sensibles ou à d’autres ressources sur le serveur. Par exemple, une personne malveillante pourrait monter une attaque en fournissant un point-virgule et en ajoutant une autre valeur. La chaîne de connexion est analysée à l’aide de l’algorithme « last one wins » (dernier gagnant) et l’entrée hostile est remplacée par une valeur légitime.

Les classes de générateur de chaînes de connexion sont conçues pour éliminer le travail de recherche et pour se protéger contre les erreurs de syntaxe et les failles en matière de sécurité. Elles fournissent des méthodes et des propriétés qui correspondent aux paires clé/valeur connues autorisées par le fournisseur de données. La classe maintient une collection fixe de synonymes et peut traduire un synonyme vers le nom de la clé connue correspondante. Des vérifications sont effectuées pour les paires clé/valeur valides et une paire non valide lève une exception. En outre, les valeurs injectées sont gérées de manière sécurisée.

L'exemple suivant montre comment SqlConnectionStringBuilder gère une valeur supplémentaire insérée pour le paramètre Initial Catalog.

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = "(local)";
builder.IntegratedSecurity = true;
builder.InitialCatalog = "AdventureWorks;NewValue=Bad";
Console.WriteLine(builder.ConnectionString);

La sortie indique que SqlConnectionStringBuilder l’a traitée correctement en plaçant la valeur supplémentaire entre des guillemets doubles au lieu de l’ajouter à la chaîne de connexion en tant que nouvelle paire clé/valeur.

data source=(local);Integrated Security=True;
initial catalog="AdventureWorks;NewValue=Bad"

Créer des chaînes de connexion à partir de fichiers de configuration

Si certains éléments d'une chaîne de connexion sont connus à l'avance, ils peuvent être stockés dans un fichier de configuration et récupérés au moment de l'exécution pour générer une chaîne de connexion complète. Par exemple, le nom de la base de données peut être connue à l'avance, mais pas celui du serveur. Ou vous souhaiterez peut-être qu’un utilisateur fournisse un nom et un mot de passe au moment de l’exécution sans pouvoir injecter d’autres valeurs dans la chaîne de connexion.

L’un des constructeurs surchargés d’un générateur de chaînes de connexion prend String en tant qu’argument, ce qui vous permet de fournir une chaîne de connexion partielle qui pourra ensuite être complétée à partir de l’entrée d’utilisateur. La chaîne de connexion partielle peut être stockée dans un fichier de configuration et récupérée au moment de l'exécution.

Notes

L'espace de noms System.Configuration autorise l'accès par programme aux fichiers de configuration qui utilisent WebConfigurationManager pour les applications Web et ConfigurationManager pour les applications Windows. Pour plus d'informations sur l'utilisation des chaînes de connexion et des fichiers de configuration, consultez Chaînes de connexion et fichiers config.

Exemple

Cet exemple montre comment récupérer une chaîne de connexion partielle d'un fichier de configuration et comment la compléter en définissant les propriétés DataSource, UserID et Password de SqlConnectionStringBuilder. Le fichier de configuration est défini comme suit.

<connectionStrings>
  <clear/>
  <add name="partialConnectString"
    connectionString="Initial Catalog=Northwind;"
    providerName="Microsoft.Data.SqlClient" />
</connectionStrings>

Notes

Vous devez définir une référence à System.Configuration.dll dans votre projet pour le code à exécuter.

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

Voir aussi