Generadores de cadenas de conexión

Se aplica a: .NET Framework .NET .NET Standard

Descargar ADO.NET

En versiones anteriores de ADO.NET, no se producía la comprobación de las cadenas de conexión con valores de cadena concatenados en tiempo de compilación, por lo que, en tiempo de ejecución, una palabra clave incorrecta generaba una excepción ArgumentException. El proveedor de datos SqlClient de Microsoft para SQL Server incluye la clase del generador de cadenas de conexión Microsoft.Data.SqlClient.SqlConnectionStringBuilder que hereda de DbConnectionStringBuilder.

Ataques de inyección de cadenas de conexión

Cuando se utiliza la concatenación dinámica de cadenas para generar cadenas de conexión basadas en datos introducidos por el usuario, se pueden producir ataques de inyección de cadenas de conexión. Si la cadena no se valida y el texto malintencionado o los caracteres no tienen caracteres de escape, el atacante puede tener acceso potencialmente a datos confidenciales u otros recursos del servidor. Por ejemplo, un atacante podría montar un ataque si proporciona un punto y coma y anexa otro valor. La cadena de conexión se analiza mediante un algoritmo "el último gana" y la entrada hostil se sustituye por un valor legítimo.

Las clases compiladoras de cadenas de conexión se han diseñado para eliminar la adivinación y desarrollar protección ante errores de sintaxis y vulnerabilidades de seguridad. Proporcionan métodos y propiedades que corresponden a los pares clave-valor conocidos que permite el proveedor de datos. Cada clase mantiene una colección fija de sinónimos y puede convertir un sinónimo al correspondiente nombre de clave conocido. Se realizan comprobaciones para los pares clave-valor válidos y un par no válido produce una excepción. Además, los valores que se insertan se controlan de forma segura.

En el ejemplo siguiente se muestra cómo SqlConnectionStringBuilder controla un valor adicional insertado en la configuración Initial Catalog.

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

El resultado muestra que SqlConnectionStringBuilder lo controló correctamente mediante el escape del valor adicional entre comillas dobles en lugar de su anexión a la cadena de conexión como un nuevo par clave-valor.

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

Creación de cadenas de conexión a partir de archivos de configuración

Si determinados elementos de una cadena de conexión se conocen de antemano, se pueden almacenar en un archivo de configuración y recuperar en tiempo de ejecución para construir una cadena de conexión completa. Por ejemplo, se puede conocer por adelantado el nombre de la base de datos, pero no el del servidor. O bien, puede que desee que un usuario proporcione un nombre y una contraseña en tiempo de ejecución sin la capacidad de insertar otros valores en la cadena de conexión.

Uno de los constructores sobrecargados de un compilador de cadenas de conexión toma String como argumento, lo que permite proporcionar una cadena de conexión parcial que se puede completar después con los datos introducidos por el usuario. La cadena de conexión parcial se puede almacenar en un archivo de configuración y recuperarse en tiempo de ejecución.

Nota:

El espacio de nombres System.Configuration permite el acceso mediante programación a archivos de configuración que usan WebConfigurationManager en aplicaciones web y ConfigurationManager en aplicaciones Windows. Para obtener más información sobre cómo trabajar con cadenas de conexión y archivos de configuración, vea Cadenas de conexión y archivos de configuración.

Ejemplo

En este ejemplo se muestra la recuperación de una cadena de conexión incluida en un archivo de configuración y cómo se completa mediante el establecimiento de las propiedades DataSource, UserID y Password de SqlConnectionStringBuilder. El archivo de configuración se define de la siguiente forma.

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

Nota:

Para ejecutar el código, debe establecer una referencia al archivo System.Configuration.dll del proyecto.

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

Vea también