La protección del acceso al origen de datos es uno de los objetivos más importantes de una aplicación segura. Para contribuir a limitar el acceso al origen de datos, debe asegurar la información de la conexión como, por ejemplo, el Id. de usuario, la contraseña y el nombre de origen de datos. El almacenamiento de un Id. de usuario y de una contraseña en texto sin formato como, por ejemplo, en el código fuente, presenta un problema de seguridad importante. Aunque proporcione una versión compilada del código con información de Id. de usuario y contraseña a un origen externo, este código compilado se puede desensamblar mediante la herramienta Desensamblador de MSIL (Ildasm.exe), con lo que el Id. de usuario y la contraseña quedarán expuestos. Por lo tanto, es fundamental que la información importante, como el Id. de usuario y la contraseña, no se encuentre en el código.
Especificar autenticación de Windows (seguridad integrada)
Se recomienda utilizar la autenticación de Windows, también conocida como seguridad integrada, siempre que sea posible. La sintaxis utilizada en la cadena de conexión varía dependiendo del proveedor. En la siguiente tabla se muestra la sintaxis utilizada con los proveedores de datos de .NET Framework.
|
Proveedor
|
Sintaxis
|
| SqlClient |
Integrated Security=true;
|
| SqlClient, OleDb |
Integrated Security=SSPI;
|
| Odbc |
|
| OracleClient |
|
Tenga en cuenta que Integrated Security=true inicia una excepción cuando se utiliza con el proveedor de OleDb.
Nota de seguridad |
|---|
| Si se establece la palabra clave Persist Security Info como true o yes en una cadena de conexión, permitirá obtener información de seguridad confidencial, incluidos el Id. de usuario y la contraseña, de la conexión una vez que esté abierta. Si es necesario proporcionar un Id. de usuario y una contraseña al realizar una conexión, estará completamente protegido si esa información se descarta una vez que se haya utilizado para establecer la conexión; esto sucede cuando Persist Security Info se establece como false o no. Esto es especialmente importante si proporciona una conexión abierta a un origen que no sea de confianza o guarda la información de conexión en disco. Si se mantiene el valor Persist Security Info como false, se contribuye a que un origen que no sea de confianza no tenga acceso a la información de seguridad confidencial de la conexión y contribuye además a que no se guarde en el disco ningún tipo de información de seguridad confidencial que contenga información de su cadena de conexión de forma predeterminada. El valor Persist Security Info está establecido como false de forma predeterminada. |
No utilice archivos de vínculo de datos universal
Se puede proporcionar información de conexión para una OleDbConnection en un archivo de vínculo de datos universal (UDL), pero conviene evitarlo. Los archivos UDL no están cifrados y exponen la información de cadena de conexión en texto sin cifrar. Un archivo UDL no se puede proteger mediante .NET Framework, ya que se trata de un recurso basado en un archivo externo a la aplicación.
Almacenar cadenas de conexión en archivos de configuración
Para evitar almacenar cadenas en el código, puede almacenarlas en el archivo web.config en una aplicación ASP.NET y en el archivo app.config en una aplicación Windows.
La cadena de conexión se puede almacenar en el archivo de configuración en el elemento <connectionStrings>. Las cadenas de conexión se almacenan como pares de clave y valor, donde el nombre se puede utilizar para buscar el valor almacenado en el atributo connectionString en tiempo de ejecución. En el siguiente ejemplo de archivo de configuración, se muestra una cadena de conexión llamada DatabaseConnection que hace referencia a una cadena de conexión que se conecta a una instancia local de SQL Server.
<connectionStrings>
<add name="DatabaseConnection"
connectionString="Persist Security Info=False;Integrated Security=SSPI;database=Northwind;server=(local);"
providerName="System.Data.SqlClient" />
</connectionStrings>
Recuperar cadenas de conexión de archivos de configuración
El espacio de nombres System.Configuration proporciona clases para trabajar con información de configuración almacenada en archivos de configuración. La clase ConnectionStringSettings tiene dos propiedades que se corresponden con los nombres que se muestran en el anterior ejemplo de sección <connectionStrings>.
- ConnectionString
-
Cadena de conexión.
- Name
-
Nombre de la cadena de conexión en la sección <connectionStrings>.
En el siguiente ejemplo se recupera la cadena de conexión del archivo de configuración pasando el nombre de la dicha cadena al ConfigurationManager, que devuelve un objeto ConnectionStringSettings. La propiedad ConnectionString sirve para mostrar el valor.
Option Explicit On
Option Strict On
Imports System.Configuration
Module Module1
Sub Main()
Dim settings As ConnectionStringSettings
settings = _
ConfigurationManager.ConnectionStrings("DatabaseConnection")
If Not settings Is Nothing Then
Console.WriteLine(settings.ConnectionString)
End If
End Sub
End Module
using System;
using System.Configuration;
class Program
{
static void Main()
{
ConnectionStringSettings settings;
settings =
ConfigurationManager.ConnectionStrings["DatabaseConnection"];
if (settings != null)
{
Console.WriteLine(settings.ConnectionString);
}
}
}
Utilizar configuración protegida para cifrar cadenas de conexión
Construir cadenas de conexión a partir de datos introducidos por el usuario
Si acepta información de cadena de conexión de un origen externo, como un usuario que proporciona un Id. de usuario y contraseña, debe validar cualquier entrada de datos de dicho origen para asegurarse de que tiene el formato correcto y de que no contiene parámetros adicionales que puedan afectar a la conexión. Para obtener más información, vea Validar los datos proporcionados por el usuario.
Utilizar generadores de cadenas de conexión
La clase DbConnectionStringBuilder proporciona la clase base de la que derivan los generadores de cadenas de conexión con establecimiento inflexible de tipos. Permiten crear mediante programación cadenas de conexión sintácticamente correctas y analizar y reconstruir cadenas de conexión existentes. Puede utilizar la clase DbConnectionStringBuilder para asignar pares de clave y valor arbitrarios y pasar la cadena de conexión resultante a un proveedor con establecimiento inflexible de tipos. Los siguientes proveedores de datos, incluidos como parte de .NET Framework, proporcionan clases con establecimiento inflexible de tipos heredadas del DbConnectionStringBuilder:
Vea también