Windows 窗体中额外的安全性注意事项
更新:2007 年 11 月
.NET Framework 安全设置可能导致应用程序在部分信任环境中运行与在本地计算机上运行有所不同。.NET Framework 限制对关键本地资源的访问,如文件系统、网络和非托管 API 等。安全性设置会影响对安全系统无法验证的 Microsoft Win32 API 或其他 API 进行调用的能力。安全性还会影响应用程序的其他方面,包括文件和数据访问以及打印。有关在部分信任环境中访问文件和数据的更多信息,请参见 Windows 窗体中更加安全的文件和数据访问。有关在部分信任环境中进行打印的更多信息,请参见 Windows 窗体中的更加安全的打印。
以下各节讨论从在部分信任环境下运行的应用程序中,如何使用剪贴板,如何执行窗口操作以及如何调用 Win32 API。
剪贴板访问
UIPermission 类控制对剪贴板的访问,而相关联的 UIPermissionClipboard 枚举值指示访问级别。下表显示可能的权限级别。
UIPermissionClipboard 值 |
说明 |
---|---|
可以随意使用剪贴板而无任何限制。 |
|
使用剪贴板时有某些限制。将数据放置到剪贴板中的能力(“复制”或“剪切”命令操作)是不受限制的。接受粘贴的内部控件(例如文本框)可接受剪贴板数据,但用户控件无法以编程方式从剪贴板读取数据。 |
|
不能使用剪贴板。 |
默认情况下,“本地 Intranet”区域接收 AllClipboard 访问,而“Internet”区域接收 OwnClipboard 访问。这意味着,应用程序可以将数据复制到剪贴板,但无法通过编程方式进行粘贴或从剪贴板进行读取。这些限制可以防止不完全受信任的程序读取另一应用程序复制到剪贴板中的内容。如果应用程序需要完全的剪贴板访问权限,但您又不具有这些权限,则必须提升应用程序的权限。有关提升权限的更多信息,请参见常规安全策略管理。
窗口操作
UIPermission 类还控制执行窗口操作和其他 UI 相关操作的权限,其关联的 UIPermissionWindow 枚举值用于指示访问级别。下表显示可能的权限级别。
默认情况下,“本地 Intranet”区域接收 AllWindows 访问,而“Internet”区域接收 SafeTopLevelWindows 访问。这意味着,在“Internet”区域中,应用程序可以执行大多数窗口操作和 UI 操作,但窗口的外观将被修改。修改后的窗口在第一次运行时将显示一则旁述通知,包含修改的标题栏文本,并需要标题栏上有一个关闭按钮。气球状通知和标题栏将向应用程序的用户标识:应用程序正在部分信任环境下运行。
UIPermissionWindow 值 |
说明 |
---|---|
用户可以使用所有窗口和用户输入事件,而无任何限制。 |
|
用户只能使用较安全的顶级窗口和子窗口进行绘制,并且只能在这些顶级窗口和子窗口中使用用户界面的用户输入事件。这些较安全窗口具有明显的标签,并具有最小化和最大化限制。这些限制可以防止潜在的有害欺骗攻击(例如模拟系统登录屏幕或系统桌面),还可以限制对父窗口及与焦点相关的 API 的编程访问以及 ToolTip 控件的使用。 |
|
用户只能使用较安全子窗口进行绘制,并且只能在该子窗口中使用用户界面的用户输入事件。浏览器中显示的控件就是一个较安全子窗口的示例。 |
|
用户不能使用任何窗口或用户界面事件。不能使用任何用户界面。 |
UIPermissionWindow 枚举标识的每个权限级别都只能执行比上一级别更少的操作。以下各表指示由 SafeTopLevelWindows 和 SafeSubWindows 值限制的操作。有关每个成员所需的确切权限,请参见 .NET Framework 类库文档中有关该成员的参考。
SafeTopLevelWindows 权限限制下表中列出的操作。
组件 |
受限制的操作 |
---|---|
|
|
|
|
|
|
|
|
|
除 SafeTopLevelWindows 值所设置的限制外,SafeSubWindows 值还限制下表中列出的操作。
组件 |
受限制的操作 |
---|---|
|
|
|
|
|
|
|
承载第三方控件
如果您的窗体承载第三方控件,可能会发生另一种窗口操作。第三方控件是指并非由您自己开发和编译的任何自定义 UserControl。尽管承载方案难以侵入,但第三方控件理论上仍有可能扩展其呈现图面以覆盖整个窗体区域。此控件随后即可模仿关键对话框,并从您的用户那里请求诸如用户名/密码组合或银行帐号等信息。
要限制这种潜在风险,应仅使用来自您可信任的供应商的第三方控件。如果您使用的第三方控件是从无法验证的源下载的,则建议您检查源代码是否有潜在侵入风险。确认源无恶意后,应自己编译程序集以确保源与程序集匹配。
Win32 API 调用
如果应用程序设计要求从 Win32 API 调用函数,则表示您正在访问非托管的代码。在这种情况下,当使用 Win32 API 调用或值时,将无法确定代码将对窗口或操作系统执行的操作。SecurityPermission 类和 SecurityPermissionFlag 枚举的 UnmanagedCode 值控制对非托管代码的访问。只有向应用程序授予 UnmanagedCode 权限后,它才能访问非托管代码。默认情况下,只有本地运行的应用程序才能调用非托管代码。
某些 Windows 窗体成员提供需要 UnmanagedCode 权限的非托管访问。下表列出了需要该权限的 System.Windows.Forms 命名空间中的成员。有关各个成员所需权限的更多信息,请参见 .NET Framework 类库文档。
组件 |
成员 |
---|---|
|
|
|
|
|
|
|
|
|
|
如果应用程序不具有调用非托管代码的权限,则应用程序必须请求 UnmanagedCode 权限,或者您应该考虑实现这些功能的其他方法;在许多情况下,Windows 窗体提供了对 Win32 API 函数的备选托管函数。如果不存在任何备选方法并且应用程序必须访问非托管代码,则必须提升应用程序的权限。
调用非托管代码的权限使应用程序几乎可以执行任何操作。因此,应该只向来自于受信任源的应用程序授予调用非托管代码的权限。另外,根据应用程序的不同,调用非托管代码的应用程序功能块可以是可选的,或者只在完全受信任的环境中启用。有关危险权限的更多信息,请参见危险权限和策略管理。有关提升权限的更多信息,请参见通用安全策略管理。