Générateurs de chaînes de connexion

Les premières versions 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. Chacun des fournisseurs de données .NET Framework prenait en charge une syntaxe différente pour les mots clés de chaîne de connexion, ce qui rendait difficile la génération de chaînes de connexion valides si l’opération était effectuée manuellement. Pour résoudre ce problème, ADO.NET 2.0 a introduit de nouveaux constructeurs de chaînes de connexion pour chaque fournisseur de données .NET Framework. Chaque fournisseur de données inclut une classe de générateur de chaînes de connexion fortement typée qui hérite de DbConnectionStringBuilder. Le tableau suivant liste les fournisseurs de données .NET Framework et leurs classes de constructeur de chaînes de connexion associées.

Fournisseur 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

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 font pas l'objet d'un échappement, un attaquant peut éventuellement accéder à des données sensibles ou à d'autres ressources sur le serveur. Par exemple, un attaquant peut organiser une attaque en fournissant un point-virgule et en ajoutant une valeur supplémentaire. La chaîne de connexion est alors analysée à l'aide de l'algorithme « last one wins », de sorte que l'entrée hostile soit 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 chaque 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 contrôler la validité des paires clé/valeur 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.

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

Important

Microsoft vous recommande d’utiliser le flux d’authentification le plus sécurisé disponible. Si vous vous connectez à Azure SQL, les identités managées pour les ressources Azure sont la méthode d'authentification recommandée.

La sortie montre que SqlConnectionStringBuilder a agi correctement en plaçant dans une séquence d'échappement, entre des guillemets doubles, la valeur supplémentaire 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.

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.

Remarque

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.

Voir aussi