La seguridad de Windows permite controlar el acceso a los recursos conforme a la función del usuario. Por ejemplo, la pertenencia al grupo de administradores de Windows concede a los administradores del sistema permisos sin restricciones, mientras que un usuario invitado cuenta con un acceso muy limitado.
En el mundo del código no administrado, la mayoría de las aplicaciones se ejecutan mediante los permisos del usuario, dificultando la aplicación de restricciones en el código. Por consiguiente, los sistemas de equipos pueden resultar dañados y se pueden poner en peligro los datos si se ejecuta software malintencionado o que contenga errores.
Por el contrario, el código administrado que se ejecuta en .NET Framework incluye un mecanismo de seguridad denominado Seguridad de acceso a código, que permite aplicar diferentes niveles de confianza en el código dependiendo del origen de éste y de otros aspectos de su identidad. De esta forma, se reduce la probabilidad de que se utilice el código de manera incorrecta.
ADO.NET y seguridad de acceso a código
Cuando se ejecuta el código, éste presenta evidencia de que lo evalúa el sistema de seguridad Common Language Runtime CLR. Este tipo de evidencia normalmente contiene el origen del código, incluidos la dirección URL, el sitio, la zona y las firmas digitales que determinan la identidad del ensamblado.
A continuación, se concede un conjunto de permisos para el código en función de la evidencia proporcionada. La aplicación puede ejecutarse correctamente o generar una SecurityException. Los valores de configuración de System.Security.Policy en el equipo local determinan los permisos que recibirá el código. Para obtener más información, vea Configurar directivas de seguridad y Administración de directivas de seguridad.
Los conjuntos de permisos se dividen generalmente en las tres categorías siguientes:
|
Categoría
|
Descripción
|
| Plena confianza | Indica que el código no tiene restricciones y se utiliza, de forma predeterminada, para orígenes de nombre seguro y el equipo local. |
| Confianza parcial | Contiene una combinación de permisos y restricciones apropiados para una determinada zona. |
| Sin confianza | Indica las zonas en las que no se ha concedido ningún permiso. El código sólo puede utilizar funciones que no requieran permisos. |
El código que se ejecuta en el CLR no se puede conceder permisos a sí mismo. Para obtener más información sobre cómo el CLR decide los permisos que se conceden, vea Seguridad del código nativo y del código de .NET Framework.
Confianza parcial en ADO.NET 2.0
En ADO.NET 2.0, el proveedor de datos de .NET Framework para SQL Server (System.Data.SqlClient), el proveedor de datos de .NET Framework para OLE DB, el proveedor de datos de .NET Framework para ODBC y el proveedor de datos de .NET Framework para Oracle pueden ejecutarse en entornos de confianza parcial. En versiones anteriores de .NET Framework, sólo se admitía el uso de System.Data.SqlClient en aplicaciones que no fuesen de plena confianza.
Una aplicación de confianza parcial que utilice el proveedor de SQL Server debe tener como mínimo permisos de ejecución y SqlClientPermission.
Propiedades de atributos de permiso de confianza parcial
En las situaciones de confianza parcial, se puede aplicar SqlClientPermissionAttribute a los miembros a fin de restringir aún más las capacidades disponibles para el proveedor de datos de .NET Framework para SQL Server.
Nota |
|---|
| El proveedor de datos de .NET Framework para SQL Server necesita permiso de plena confianza para abrir una SqlConnection con la depuración de SQL habilitada en SQL Server 2000. La depuración de SQL para SQL Server 2005 no utiliza esta clase. Para obtener más información, vea los Libros en pantalla de SQL Server 2005. |
En la siguiente tabla se muestran y se describen las propiedades SqlClientPermissionAttribute disponibles:
|
Propiedad de atributo de permiso
|
Descripción
|
| Action | Obtiene o establece una acción de seguridad. Se hereda de SecurityAttribute. |
| AllowBlankPassword | Habilita o deshabilita el uso de una contraseña en blanco en una cadena de conexión. Los valores válidos son true para habilitar el uso de contraseñas en blanco y false para deshabilitarlo. Se hereda de DBDataPermissionAttribute. |
| ConnectionString | Identifica una cadena de conexión admitida. Se pueden identificar varias cadenas de conexión. Nota |
|---|
| No incluya un Id. de usuario o una contraseña en la cadena de conexión. En esta versión no se pueden modificar las restricciones de las cadenas de conexión mediante la herramienta Configuración de .NET Framework. |
Se hereda de DBDataPermissionAttribute. |
| KeyRestrictions | Identifica qué parámetros de las cadenas de conexión están permitidos o no lo están. Los parámetros de las cadenas de conexión se identifican con el formato <nombre de parámetro>=. Se pueden especificar varios parámetros separados por punto y coma (;). Nota Si no especifica KeyRestrictions, pero establece la propiedad KeyRestrictionBehavior en AllowOnly o PreventUsage, no se permiten parámetros de cadena de conexión adicionales. Se hereda de DBDataPermissionAttribute. |
| KeyRestrictionBehavior | Identifica los parámetros de cadena de conexión como los únicos parámetros adicionales permitidos (AllowOnly), o bien identifica los parámetros adicionales no permitidos (PreventUsage)). AllowOnly es el valor predeterminado. Se hereda de DBDataPermissionAttribute. |
| TypeID | Obtiene un identificador único para el atributo cuando se implementa en una clase derivada. Se hereda de Attribute. |
| Unrestricted | Indica si se declaran permisos protegidos para el origen. Se hereda de SecurityAttribute.) |
Sintaxis de ConnectionString
En el siguiente ejemplo se muestra cómo se utiliza el elemento connectionStrings de un archivo de configuración para permitir únicamente el uso de una determinada cadena de conexión. Para obtener más información sobre el almacenamiento de cadenas de conexión en archivos de configuración y recuperación de las mismas, vea Trabajo con cadenas de conexión.
<connectionStrings>
<add name="DatabaseConnection"
connectionString="Data Source=(local);Initial
Catalog=Northwind;Integrated Security=SSPI;" />
</connectionStrings>
Sintaxis de KeyRestrictions
En el ejemplo siguiente se habilita la misma cadena de conexión, se habilita el uso de las opciones de cadena de conexión Encrypt y Packet Size, pero se restringe el uso de otras opciones de cadena de conexión.
<connectionStrings>
<add name="DatabaseConnection"
connectionString="Data Source=(local);Initial
Catalog=Northwind;Integrated Security=SSPI;"
KeyRestrictions="Encrypt=;Packet Size=;"
KeyRestrictionBehavior="AllowOnly" />
</connectionStrings>
Sintaxis de KeyRestrictionBehavior con PreventUsage
En el ejemplo siguiente se habilita la misma cadena de conexión y se permiten todos los demás parámetros de conexión excepto User Id, Password y Persist Security Info.
<connectionStrings>
<add name="DatabaseConnection"
connectionString="Data Source=(local);Initial
Catalog=Northwind;Integrated Security=SSPI;"
KeyRestrictions="User Id=;Password=;Persist Security Info=;"
KeyRestrictionBehavior="PreventUsage" />
</connectionStrings>
Sintaxis de KeyRestrictionBehavior con AllowOnly
En el ejemplo siguiente se habilitan dos cadenas de conexión que contienen los parámetros Initial Catalog, Connection Timeout, Encrypt y Packet Size. El resto de los parámetros de cadenas de conexión están restringidos.
<connectionStrings>
<add name="DatabaseConnection"
connectionString="Data Source=(local);Initial
Catalog=Northwind;Integrated Security=SSPI;"
KeyRestrictions="Initial Catalog;Connection Timeout=;
Encrypt=;Packet Size=;"
KeyRestrictionBehavior="AllowOnly" />
<add name="DatabaseConnection2"
connectionString="Data Source=SqlServer2;Initial
Catalog=Northwind2;Integrated Security=SSPI;"
KeyRestrictions="Initial Catalog;Connection Timeout=;
Encrypt=;Packet Size=;"
KeyRestrictionBehavior="AllowOnly" />
</connectionStrings>
Habilitar confianza parcial con un conjunto de permisos personalizados
Para habilitar el uso de permisos System.Data.SqlClient para una zona determinada, un administrador del sistema debe crear un conjunto de permisos personalizados y establecerlo como el conjunto de permisos de dicha zona. Los conjuntos de permisos predeterminados, como LocalIntranet, no se pueden modificar. Por ejemplo, para incluir permisos System.Data.SqlClient para un código que tiene una Zone de LocalIntranet, un administrador del sistema tendría que copiar el conjunto de permisos para LocalIntranet, cambiar el nombre a "CustomLocalIntranet", agregar los permisos System.Data.SqlClient, importar el conjunto de permisos CustomLocalIntranet mediante Herramienta de la directiva de seguridad de acceso a código (Caspol.exe) y establecer el conjunto de permisos de LocalIntranet_Zone en CustomLocalIntranet.
Conjunto de permisos de ejemplo
A continuación se muestra un ejemplo de un conjunto de permisos para el proveedor de datos de .NET Framework para SQL Server en un escenario que no es de plena confianza. Para obtener información sobre la creación de conjuntos de permisos, vea Configurar conjuntos de permisos mediante Caspol.exe.
<PermissionSet class="System.Security.NamedPermissionSet"
version="1"
Name="CustomLocalIntranet"
Description="Custom permission set given to applications on the local intranet">
<IPermission class="System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1"
AllowBlankPassword="False">
<add ConnectionString="Data Source=(local);Integrated Security=SSPI;"
KeyRestrictions="Initial Catalog=;Connection Timeout=;Encrypt=;Packet Size=;"
KeyRestrictionBehavior="AllowOnly" />
</IPermission>
</PermissionSet>
Comprobar el acceso a código de ADO.NET mediante permisos de seguridad
En las situaciones de confianza parcial, puede solicitar privilegios de seguridad de acceso a código para determinados métodos en el código al especificar SqlClientPermissionAttribute. Si la directiva de seguridad restringida no permite el privilegio, se inicia una excepción antes de ejecutarse el código. Para obtener más información sobre directivas de seguridad, vea Administración de directivas de seguridad y Procedimientos recomendados para directivas de seguridad.
Ejemplo
En el siguiente ejemplo se muestra cómo escribir código que requiera una determinada cadena de conexión. Simula la denegación de permisos sin restricciones para System.Data.SqlClient, que podría implementar un administrador del sistema en una situación real mediante una directiva de seguridad de acceso a código. Al utilizar permisos de seguridad de acceso a código en ADO.NET, el procedimiento correcto es comenzar con el caso más restrictivo (sin ningún permiso) y, a continuación, agregar todos los permisos específicos necesarios para la tarea determinada que el código lleva a cabo. No es seguro comenzar con todos los permisos e intentar denegar un permiso determinado posteriormente, ya que existen numerosas formas de expresar la misma cadena de conexión. Por ejemplo, si comienza con todos los permisos y posteriormente deniega el uso de la cadena de conexión "server=someserver", todavía se podría utilizar la cadena "server=someserver.mycompany.com". Al comenzar siempre sin ningún permiso, se garantiza que no existirán deficiencias en el conjunto de permisos.
En el siguiente código se muestra cómo SqlClient realiza la petición de seguridad, que inicia una SecurityException si los permisos de seguridad de acceso a código apropiados no se encuentran en su lugar. El resultado SecurityException se muestra en la ventana de la consola.
Public Sub CreateOdbcParameter()
Dim myParameter As New OdbcParameter("Description", OdbcType.VarChar, _
11, ParameterDirection.Output, True, 0, 0, "Description", _
DataRowVersion.Current, "garden hose")
Console.WriteLine(myParameter.ToString())
End Sub
public void CreateOdbcParameter()
{
OdbcParameter myParameter = new OdbcParameter(
"Description", OdbcType.VarChar, 11,
ParameterDirection.Output, true, 0, 0, "Description",
DataRowVersion.Current, "garden hose");
Console.WriteLine(myParameter.ToString());
}
Debe poder ver este resultado en la ventana de la consola:
Failed, as expected: <IPermission class="System.Data.SqlClient.
SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" AllowBlankPassword="False">
<add ConnectionString="Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI" KeyRestrictions=""
KeyRestrictionBehavior="AllowOnly"/>
</IPermission>
Connection opened, as expected.
Failed, as expected: Request failed.
Vea también