Consideraciones de seguridad adicionales en formularios Windows Forms

La configuración de seguridad de .NET Framework puede hacer que la aplicación se ejecute de manera diferente en un entorno de confianza parcial que en el equipo local. .NET Framework restringe el acceso a recursos locales críticos como el sistema de archivos, la red y API no administradas, entre otras cosas. La configuración de seguridad afecta a la capacidad de llamar a la API de Microsoft Windows u otras API que no pueda comprobar el sistema de seguridad. La seguridad afecta también a otros aspectos de la aplicación, incluido el acceso a archivos y datos y su impresión. Para más información sobre el acceso a archivos y datos en un entorno de confianza parcial, consulte Acceso más seguro a archivos y datos en Windows Forms. Para más información sobre cómo imprimir en un entorno de confianza parcial, consulte Impresión más segura en Windows Forms.

En las siguientes secciones se explica cómo trabajar con el Portapapeles, manipular ventanas y llamar a la API de Windows desde aplicaciones que se ejecutan en un entorno de confianza parcial.

Acceso al Portapapeles

La clase UIPermission controla el acceso al Portapapeles y el valor de enumeración UIPermissionClipboard asociado indica el nivel de acceso. En la tabla siguiente se muestran los niveles de permiso posibles.

Valor UIPermissionClipboard Descripción
AllClipboard El Portapapeles se puede utilizar sin límites.
OwnClipboard El Portapapeles se puede utilizar con ciertas limitaciones. La capacidad de colocar datos en el Portapapeles (operaciones del comando Copiar o Cortar) no está limitada. Los controles intrínsecos que acepten Pegar, como un cuadro de texto, pueden aceptar datos del Portapapeles, pero los controles de usuario no pueden leer el Portapapeles mediante programación.
NoClipboard No se puede usar el Portapapeles.

De manera predeterminada, la zona Intranet local recibe el acceso AllClipboard y la zona Internet recibe el acceso OwnClipboard. Esto significa que la aplicación puede copiar datos en el Portapapeles, pero no puede leer el Portapapeles ni pegar datos en él mediante programación. Estas limitaciones impiden que los programas que no sean de plena confianza lean el contenido copiado en el Portapapeles por otra aplicación. Si la aplicación requiere acceso total al Portapapeles pero no tiene los permisos necesarios, deberá conceder dichos permisos a la aplicación. Para más información sobre la elevación de permisos, vea Administración general de directivas de seguridad.

Manipulación de ventanas

La clase UIPermission también controla el permiso para manipular ventanas y otras acciones relacionadas con la interfaz de usuario UIPermissionWindow asociado indica el nivel de acceso. En la tabla siguiente se muestran los niveles de permiso posibles.

De manera predeterminada, la zona Intranet local recibe el acceso AllWindows y la zona Internet recibe el acceso SafeTopLevelWindows. Esto significa que, en la zona Internet, la aplicación puede realizar la mayoría de las operaciones de ventanas de la interfaz de usuario, pero se modificará la apariencia de la ventana. La ventana modificada muestra una notificación en un globo la primera vez que se ejecuta, contiene el texto de la barra de título modificada y requiere un botón Cerrar en la barra de título. La notificación del globo y la barra de título informan al usuario de la aplicación que esta se está ejecutando bajo confianza parcial.

Valor UIPermissionWindow Descripción
AllWindows Los usuarios pueden utilizar todas las ventanas y eventos de entrada de usuario sin restricciones.
SafeTopLevelWindows Los usuarios solo pueden utilizar ventanas de nivel superior y ventanas secundarias más seguras para dibujar, y solo pueden utilizar eventos de entrada de datos del usuario para la interfaz de usuario dentro de dichas ventanas de nivel superior y ventanas secundarias. Estas ventanas más seguras están claramente etiquetadas y tienen restricciones de tamaño máximo y mínimo. Las restricciones evitan posibles ataques de suplantación de identidad peligrosos, como la imitación de las pantallas de inicio de sesión en el sistema o del escritorio del sistema, y limitan el acceso mediante programación a las ventanas primarias, a las API relacionadas con el foco y el uso del control ToolTip.
SafeSubWindows Los usuarios solo pueden utilizar ventanas secundarias más seguras para dibujar, y solo pueden utilizar eventos de entrada del usuario para la interfaz de usuario dentro de esa ventana secundaria. Un control mostrado en un explorador es un ejemplo de una ventana secundaria más segura.
NoWindows Los usuarios no pueden utilizar ninguna ventana ni ningún evento de interfaz de usuario. No se puede utilizar ninguna interfaz de usuario.

Cada nivel de permiso identificado por la enumeración UIPermissionWindow permite menos acciones que su nivel superior. Las tablas siguientes indican las acciones que restringen los valores SafeTopLevelWindows y SafeSubWindows. Para saber los permisos exactos necesarios para cada miembro, consulte el material de referencia de dicho miembro en la documentación de la biblioteca de clases de .NET Framework.

El permiso SafeTopLevelWindows restringe las acciones que se citan en la tabla siguiente.

Componente Acciones restringidas
Application - Establecer la propiedad SafeTopLevelCaptionFormat.
Control - Obtener la propiedad Parent.
- Establecer la propiedad Region.
- Llamar al método FindForm, Focus, FromChildHandle y FromHandle, PreProcessMessage, ReflectMessage o al método SetTopLevel .
- Llamar al método GetChildAtPoint si el control devuelto no es un elemento secundario del control que llama.
- Modificar el foco en un control contenedor.
Cursor - Establecer la propiedad Clip.
- Llamar al método Hide.
DataGrid - Llamar al método ProcessTabKey.
Form - Obtener la propiedad ActiveForm o MdiParent.
- Obtener la propiedad ControlBox, ShowInTaskbar o TopMost.
- Establecer la propiedad Opacity por debajo del 50 %.
- Establecer la propiedad WindowState en Minimized mediante programación.
- Llamar al método Activate.
- Usar los valores de enumeración None, FixedToolWindow y SizableToolWindow, FormBorderStyle.
NotifyIcon - Usar el componente NotifyIcon está completamente restringido.

El valor SafeSubWindows restringe las acciones enumeradas en la siguiente tabla, además de las limitaciones que impone el valor SafeTopLevelWindows.

Componente Acciones restringidas
CommonDialog - Mostrar un cuadro de diálogo que derive de la clase CommonDialog.
Control - Llamar al método CreateGraphics.
- Establecer la propiedad Cursor.
Cursor - Establecer la propiedad Current.
MessageBox - Llamar al método Show.

Hospedaje de controles de terceros

Otro tipo de manipulación de ventanas es posible si los formularios hospedan controles de terceros. Un control de terceros es cualquier UserControl personalizado que no ha desarrollado y compilado usted mismo. Aunque el escenario de hospedaje es difícil de manipular, teóricamente es posible que un control de terceros expanda su superficie de representación para abarcar toda el área del formulario. Después, el control podría imitar un cuadro de diálogo crítico y solicitar información tal como una combinación de nombre de usuario y contraseña o los números de cuenta bancaria de sus usuarios.

Para limitar este riesgo potencial, utilice controles de terceros pertenecientes únicamente a proveedores de confianza. Si utiliza controles de terceros que ha descargado de un origen que no puede comprobar, se recomienda que revise el código fuente en busca de posibles puntos vulnerables. Después de comprobar que el origen no es malintencionado, debería compilar el ensamblado para garantizar que el origen coincide con el ensamblado.

Llamadas API de Windows

Si el diseño de la aplicación requiere llamar a una función de la API de Windows, estará teniendo acceso a código no administrado. En este caso las acciones del código en la ventana o el sistema operativo no se pueden determinar cuando se trabaja con valores o llamadas API de Windows. La clase SecurityPermission y el valor UnmanagedCode del control de enumeración SecurityPermissionFlag acceden a código no administrado. Una aplicación solo puede acceder a código no administrado cuando tiene el permiso UnmanagedCode. De manera predeterminada, solo las aplicaciones que se ejecutan localmente pueden llamar a código no administrado.

Algunos miembros de Windows Forms proporcionan acceso no administrado que requiere el permiso UnmanagedCode. En la siguiente tabla se enumeran los miembros del espacio de nombres System.Windows.Forms que requieren el permiso. Para más información sobre los permisos necesarios para un miembro, consulte la documentación de la biblioteca de clases de .NET Framework.

Componente Member
Application Método - AddMessageFilter
- Propiedad CurrentInputLanguage
Método - Exit
Método - ExitThread
- Evento ThreadException
CommonDialog Método - HookProc
- Método OwnerWndProc\
Método - Reset
Método - RunDialog
Control Método - CreateParams
Método - DefWndProc
Método - DestroyHandle
Método - WndProc
Help - Métodos ShowHelp
Método - ShowHelpIndex
NativeWindow - Clase NativeWindow
Screen Método - FromHandle
SendKeys Método - Send
Método - SendWait

Si la aplicación no tiene permiso para llamar a código no administrado, tendrá que solicitar el permiso UnmanagedCode, o deberá considerar modos alternativos de implementar las características; en muchos casos, Windows Forms proporciona una alternativa administrada a las funciones de la API de Windows. Si no existen ningún medio alternativo y la aplicación debe tener acceso a código no administrado, deberá elevar los permisos a la aplicación.

El permiso para llamar a código no administrado permite a una aplicación realizar casi todo. Por ello, este permiso para llamar a código no administrado únicamente se debe conceder a aplicaciones que procedan de un origen de confianza. De forma alternativa, dependiendo de la aplicación, la función que realiza la llamada al código no administrado podría ser opcional, o solo habilitarse en el entorno de plena confianza. Para más información sobre los permisos arriesgados, vea Dangerous Permissions and Policy Administration (Permisos peligrosos y administración de directivas). Para más información sobre la elevación de permisos, vea Administración general de directivas de seguridad.

Consulte también