安全性 (WPF)

在开发 Windows Presentation Foundation (WPF) 独立应用程序和浏览器承载的应用程序时,必须考虑安全模型。 不管是使用 Windows Installer (.msi)、XCopy 还是 ClickOnce 进行部署,WPF 独立应用程序都使用不受限制的权限(CASFullTrust 权限集)执行。 不支持使用 ClickOnce 部署部分信任的独立 WPF 应用程序。 但是完全信任的宿主应用程序可以使用 .NET Framework 加载项模型创建部分信任的 AppDomain。 有关详细信息,请参阅 WPF 加载项概述

WPF 浏览器承载的应用程序由 Windows Internet Explorer 或 Firefox 承载,可以是 XAML 浏览器应用程序 (XBAP) 或松散的 Extensible Application Markup Language (XAML) 文档。有关详细信息,请参阅 WPF XAML 浏览器应用程序概述

WPF 浏览器承载的应用程序在一个部分信任的安全沙盒内执行,默认情况下,仅限于默认 CASInternet 区域权限集。 这样可以有效地将 WPF 浏览器承载的应用程序与客户端计算机进行隔离,其方式与隔离典型 Web 应用程序的方式相同。 XBAP 最高可以将权限提升到“完全信任”,具体取决于部署 URL 的安全区域和客户端的安全配置。 有关详细信息,请参阅 WPF 部分信任安全性

本主题介绍 Windows Presentation Foundation (WPF) 独立应用程序和浏览器承载应用程序的安全模型。

本主题包含以下各节:

安全导航

对于 XBAP,WPF 区分两种类型的导航:应用程序和浏览器。

应用程序导航是指在浏览器托管的应用程序内的内容项之间进行导航。 浏览器导航是指可更改浏览器自身的内容和位置 URL 的导航。 应用程序导航(通常为 XAML)与浏览器导航(通常为 HTML)之间的关系如下图所示:

Relationship between application navigation and browser navigation.

XBAP 可以安全导航到的内容类型主要取决于使用的是应用程序导航还是浏览器导航。

应用程序导航安全性

如果应用程序导航可以通过包 URI 标识,则可视为安全,它支持四种类型的内容:

内容类型 说明 URI 示例
资源 添加到生成类型为“资源”的项目的文件。 pack://application:,,,/MyResourceFile.xaml
内容 添加到生成类型为“内容”的项目的文件。 pack://application:,,,/MyContentFile.xaml
源站点 添加到生成类型为“无”的项目的文件。 pack://siteoforigin:,,,/MySiteOfOriginFile.xaml
应用程序代码 具有已编译代码隐藏的 XAML 资源。

-或-

添加到生成类型为“页面”的项目的 XAML 文件。
pack://application:,,,/MyResourceFile .xaml

注意

有关应用程序数据文件和包 URI 的详细信息,请参阅 WPF 应用程序资源、内容和数据文件

可以由用户导航到这些内容类型的文件,也可以通过编程方式导航到这些内容类型的文件:

  • 用户导航。 用户通过单击 Hyperlink 元素进行导航。

  • 编程导航。 应用程序在不涉及用户的情况下进行导航,例如通过设置 NavigationWindow.Source 属性。

浏览器导航安全性

浏览器导航仅在以下条件下被视为安全:

  • 用户导航。 用户通过单击主 NavigationWindow(而不是嵌套 Frame)内的 Hyperlink 元素进行导航。

  • 区域。 要导航到的内容位于 Internet 或本地 Intranet 上。

  • 协议。 使用的协议有 http、https、file 或 mailto。

如果 XBAP 尝试以不符合这些条件的方式导航到内容,则会引发 SecurityException

Web 浏览软件安全设置

计算机上的安全设置决定了任何 Web 浏览软件被授予的访问权限。 Web 浏览软件包括任何使用 WinINetUrlMon API 的应用程序或组件,其中包括 Internet Explorer 和 PresentationHost.exe。

Internet Explorer 提供了一种机制,通过它可以配置允许由 Internet Explorer 执行或从其执行的功能,包括以下各项:

  • .NET Framework 依赖组件

  • ActiveX 控件和插件

  • 下载

  • 脚本编写

  • 用户身份验证

可以这种方式确保安全的功能集合在每区域基础上针对 Internet、Intranet、受信任的站点和受限制的站点区域进行配置。 以下步骤描述如何配置安全设置:

  1. 打开“控制面板”

  2. 单击“网络和 Internet”,然后单击“Internet 选项”。

    将显示“Internet 选项”对话框。

  3. 在“安全”选项卡上,选择要为其配置安全设置的区域。

  4. 单击“自定义级别”按钮。

    将出现“安全设置”对话框,你可以为所选区域配置安全设置。

    Screenshot that shows the Security Settings dialog box.

注意

也可以从 Internet Explorer 中进入“Internet 选项”对话框。 单击“工具”,然后单击“Internet 选项”。

从 Windows Internet Explorer 7 开始,将包括以下专门针对 .NET Framework 的安全设置:

  • 宽松 XAML。 控制 Internet Explorer 是否可以导航到宽松 XAML 文件。 (“启用”、“禁用”和“提示”选项)。

  • XAML 浏览器应用程序。 控制 Internet Explorer 是否可以导航到并运行 XBAP。 (“启用”、“禁用”和“提示”选项)。

默认情况下,将对 Internet、本地 Intranet 和受信任的站点区域启用所有这些设置,而对受限制的站点区域则禁用这些设置。

除了可通过“Internet 选项”设置的安全设置之外,还可以通过设置以下注册表值有选择地阻止许多安全敏感 WPF 功能。 这些值在以下注册表项下定义:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\Windows Presentation Foundation\Features

下表列出了可以设置的值。

值名称 值类型 值数据
XBAPDisallow REG_DWORD 1 为禁止;0 为允许。
LooseXamlDisallow REG_DWORD 1 为禁止;0 为允许。
WebBrowserDisallow REG_DWORD 1 为禁止;0 为允许。
MediaAudioDisallow REG_DWORD 1 为禁止;0 为允许。
MediaImageDisallow REG_DWORD 1 为禁止;0 为允许。
MediaVideoDisallow REG_DWORD 1 为禁止;0 为允许。
ScriptInteropDisallow REG_DWORD 1 为禁止;0 为允许。

WebBrowser 控件和功能控件

WPF WebBrowser 控件可用于承载 Web 内容。 WPF WebBrowser 控件包装基础 WebBrowser ActiveX 控件。 使用 WPF WebBrowser 控件来承载不受信任的 Web 内容时,WPF 提供了某些支持来保护应用程序的安全。 但是,某些安全功能必须由使用 WebBrowser 控件的应用程序直接应用。 有关 WebBrowser ActiveX 控件的详细信息,请参阅 WebBrowser 控件概述和教程

注意

本部分也适用于 Frame 控件,因为该控件使用 WebBrowser 导航到 HTML 内容。

如果使用 WPF WebBrowser 控件来承载不受信任的 Web 内容,那么应用程序应使用部分信任的 AppDomain 来帮助将应用程序代码与潜在的恶意 HTML 脚本代码隔离。 如果应用程序通过使用 InvokeScript 方法和 ObjectForScripting 属性来与承载的脚本进行交互,则尤为如此。 有关详细信息,请参阅 WPF 加载项概述

如果应用程序使用 WPF WebBrowser 控件,则提高安全性和减轻攻击的另一种方法是启用 Internet Explorer 功能控件。 功能控件是 Internet Explorer 的新增功能,使管理员和开发人员能够配置 Internet Explorer 和承载 WebBrowser ActiveX 控件(包装在 WPF WebBrowser 控件中)的应用程序的功能。 可通过使用 CoInternetSetFeatureEnabled 函数或更改注册表中的值来配置功能控件。 有关功能控件的详细信息,请参阅功能控件简介Internet 功能控件

如果开发使用 WPF WebBrowser 控件的独立 WPF 应用程序,WPF 将自动为应用程序启用以下功能控件。

功能控件
FEATURE_MIME_HANDLING
FEATURE_MIME_SNIFFING
FEATURE_OBJECT_CACHING
FEATURE_SAFE_BINDTOOBJECT
FEATURE_WINDOW_RESTRICTIONS
FEATURE_ZONE_ELEVATION
FEATURE_RESTRICT_FILEDOWNLOAD
FEATURE_RESTRICT_ACTIVEXINSTALL
FEATURE_ADDON_MANAGEMENT
FEATURE_HTTP_USERNAME_PASSWORD_DISABLE
FEATURE_SECURITYBAND
FEATURE_UNC_SAVEDFILECHECK
FEATURE_VALIDATE_NAVIGATE_URL
FEATURE_DISABLE_TELNET_PROTOCOL
FEATURE_WEBOC_POPUPMANAGEMENT
FEATURE_DISABLE_LEGACY_COMPRESSION
FEATURE_SSLUX

由于这些功能控件是无条件启用的,因此它们可能会对完全信任的应用程序造成损害。 在这种情况下,如果特定应用程序及其承载的内容没有安全风险,则可以禁用相应的功能控件。

功能控件由实例化 WebBrowser ActiveX 对象的进程应用。 因此,如果要创建可导航到不受信任的内容的独立应用程序,则应该认真考虑启用附加功能控件。

注意

此建议是根据 MSHTML 和 SHDOCVW 主机安全性的一般性建议提出的。 有关详细信息,请参阅 MSHTML 主机安全性常见问题:第 I 部分(共 II 部分)MSHTML 主机安全性常见问题:第 II 部分(共 II 部分)

对于可执行文件,请考虑通过将注册表值设置为 1 来启用以下功能控件。

功能控件
FEATURE_ACTIVEX_REPURPOSEDETECTION
FEATURE_BLOCK_LMZ_IMG
FEATURE_BLOCK_LMZ_OBJECT
FEATURE_BLOCK_LMZ_SCRIPT
FEATURE_RESTRICT_RES_TO_LMZ
FEATURE_RESTRICT_ABOUT_PROTOCOL_IE7
FEATURE_SHOW_APP_PROTOCOL_WARN_DIALOG
FEATURE_LOCALMACHINE_LOCKDOWN
FEATURE_FORCE_ADDR_AND_STATUS
FEATURE_RESTRICTED_ZONE_WHEN_FILE_NOT_FOUND

对于可执行文件,请考虑通过将注册表值设置为 0 来禁用以下功能控件。

功能控件
FEATURE_ENABLE_SCRIPT_PASTE_URLACTION_IF_PROMPT

如果在 Windows Internet Explorer 中运行包括 WPF WebBrowser 控件的部分信任的 XAML 浏览器应用程序 (XBAP),则 WPF 将在 Internet Explorer 进程的地址空间中承载 WebBrowser ActiveX 控件。 由于 WebBrowser ActiveX 控件承载于 Internet Explorer 进程中,因此也会为 WebBrowser ActiveX 控件启用 Internet Explorer 的所有功能控件。

与普通的独立应用程序相比,运行于 Internet Explorer 中的 XBAP 还将另外获得一层安全保护。 之所以有这一层安全保护,原因是 Internet Explorer 在 Windows Vista 和 Windows 7 上默认情况下以保护模式运行,因此 WebBrowser ActiveX 控件也在保护模式下运行。 有关保护模式的详细信息,请参阅了解保护模式和在保护模式下使用 Internet Explorer

注意

如果尝试在 Firefox 中运行包括 WPF WebBrowser 控件的 XBAP,当处于 Internet 区域中时,将引发 SecurityException。 这是由于 WPF 安全策略造成的。

对部分受信任的客户端应用程序禁用 APTCA 程序集

当托管程序集安装到全局程序集缓存 (GAC) 中时,它们会变得完全受信任,因为用户必须提供明确的权限才能安装它们。 因为这些程序集是完全受信任的,所以只有完全受信任的托管客户端应用程序才可以使用它们。 若要允许部分受信任的应用程序使用它们,则它们必须标记有 AllowPartiallyTrustedCallersAttribute (APTCA)。 仅当程序集经过测试,可在部分信任的情况下安全执行时,才应该为其标记此特性。

但是,APTCA 程序集在安装到 GAC 后,可能会暴露出安全漏洞。 一旦发现安全漏洞,程序集发布者可以生成安全更新来修复现有安装上的问题,还可以阻止问题发现后进行的安装操作。 其中一个更新选项是卸载程序集,即使这可能中断使用该程序集的其他完全受信任的客户端应用程序。

WPF 提供了一种机制,通过该机制可以对部分受信任的 XBAP 禁用 APTCA 程序集,而无需卸载 APTCA 程序集。

若要禁用 APTCA 程序集,必须创建一个特殊的注册表项:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\policy\APTCA\<AssemblyFullName>, FileVersion=<AssemblyFileVersion>

示例如下:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\policy\APTCA\aptcagac, Version=1.0.0.0, Culture=neutral, PublicKeyToken=215e3ac809a0fea7, FileVersion=1.0.0.0

此项建立 APTCA 程序集的条目。 还必须在此项中创建值来启用或禁用程序集。 下面是该值的详细信息:

  • 值名称:APTCA_FLAG。

  • 值类型:REG_DWORD。

  • 值数据:1 为禁用;0 为启用。

如果必须为部分受信任的客户端应用程序禁用某程序集,可以编写一个用于创建注册表项和值的更新。

注意

以这种方式禁用 Core .NET Framework 程序集不会影响它们,因为它们是托管应用程序运行所必需的。 对禁用 APTCA 程序集的支持主要面向第三方应用程序。

宽松 XAML 文件的沙盒行为

宽松 XAML 文件是仅标记 XAML 文件,这些文件不依赖任何代码隐藏、事件处理程序或应用程序特定的程序集。 当直接从浏览器中导航到宽松 XAML 文件时,将会基于默认 Internet 区域权限集在安全沙盒中加载这些文件。

但是,当从独立应用程序中的 NavigationWindowFrame 导航到宽松 XAML 文件时,安全行为将有所不同。

在这两种情况下,导航到的宽松 XAML 文件都将继承其宿主应用程序的权限。 但是,从安全性的角度讲,此行为可能不是很理想,尤其是当宽松 XAML 文件由不受信任或未知的实体生成时。 这种类型的内容称为外部内容,当导航到此类内容时可以配置 FrameNavigationWindow 来隔离它。 通过将 SandboxExternalContent 属性设置为 true,可以实现隔离,如以下 FrameNavigationWindow 的示例所示:

<Frame 
  Source="ExternalContentPage.xaml" 
  SandboxExternalContent="True">
</Frame>
<!-- Sandboxing external content using NavigationWindow-->
<NavigationWindow 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  Source="ExternalContentPage.xaml" 
  SandboxExternalContent="True">
</NavigationWindow>

使用此设置,外部内容将加载到不同于承载应用程序的进程的进程中。 此进程被限制在默认 Internet 区域权限集中,从而有效地将其与承载应用程序和客户端计算机隔离。

注意

尽管从独立应用程序中的 NavigationWindowFrame 导航到宽松 XAML 文件是基于 WPF 浏览器承载基础结构实现的(涉及 PresentationHost 进程),但与在 Windows Vista 和 Windows 7 上直接在 Internet Explorer 中加载内容(仍然通过 PresentationHost)时相比,安全级别要稍差一些。 这是因为使用 Web 浏览器的独立 WPF 应用程序不提供 Internet Explorer 的额外“保护模式”安全功能。

用于开发可提高安全性的 WPF 应用程序的资源

下面是一些可帮助开发提高安全性的 WPF 应用程序的其他资源:

区域 资源
托管代码 应用程序的模式和实践安全指南
CAS 代码访问安全性
ClickOnce ClickOnce 安全和部署
WPF WPF 部分信任安全

另请参阅