安全性 (WPF)

在开发 Windows Presentation Foundation (WPF) 独立应用程序和浏览器承载的应用程序时,您必须考虑安全模式。不管是使用 Windows Installer (.msi)、XCopy 还是 ClickOnce 进行部署,WPF 独立应用程序都将采用无限制的权限(CAS FullTrust 权限集)执行。 不支持使用 ClickOnce 部署部分信任的独立 WPF 应用程序。 不过,完全信任的宿主应用程序可以使用 .NET Framework 外接程序模型创建部分信任的 AppDomain。 有关更多信息,请参见 WPF 外接程序概述

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

WPF 浏览器承载的应用程序在一个部分信任的安全沙盒中执行,在默认情况下,仅限于默认 CAS Internet 区域权限集。 这可以有效地将 WPF 浏览器承载的应用程序与客户端计算机进行隔离,采用的方法与希望隔离典型 Web 应用程序所用的方法相同。 XBAP 最高可以将权限提升到“完全信任”,具体情况视部署 URL 的安全区域和客户端的安全配置而定。 有关更多信息,请参见 WPF 部分信任安全

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

本主题包含以下各节:

  • 安全导航

  • Web 浏览软件安全设置

  • WebBrowser 控件和功能控制

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

  • 松散 XAML 文件的沙盒行为

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

安全导航

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

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

导航示意图

是否将内容类型视为可供 XBAP 安全导航主要取决于是使用应用程序导航还是浏览器导航。

应用程序导航的安全性

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

内容类型

说明

URI 示例

资源

使用生成类型“资源”添加到项目中的文件。

pack://application:,,,/MyResourceFile.xaml

Content

使用生成类型“内容”添加到项目中的文件。

pack://application:,,,/MyContentFile.xaml

源站点

使用生成类型“无”添加到项目中的文件。

pack://siteoforigin:,,,/MySiteOfOriginFile.xaml

应用程序代码

具有已编译的代码隐藏的 XAML 资源。

- 或 -

使用生成类型“页”添加到项目中的 XAML 文件。

pack://application:,,,/MyResourceFile.xaml

注意注意

有关应用程序数据文件和打包的 URIs 的更多信息,请参见 WPF 应用程序资源、内容和数据文件

用户可能会导航到这些内容类型的文件,或者可能通过编程方式导航到这些内容类型的文件。

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

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

浏览器导航的安全性

只有在以下条件下,才会将浏览器导航视为安全:

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

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

  • 协议。 使用的协议是 httphttpsfilemailto

如果 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. 单击**“自定义级别”**按钮。

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

    “安全设置”对话框

注意注意

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

从 Windows Internet Explorer 7 开始,包括了以下四种专门为 .NET Framework 提供的安全设置:

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

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

默认情况下,将对**“Internet”“本地 Intranet”“可信站点”区域启用所有这些设置,而对“受限站点”**区域则禁用这些设置。

与安全相关的 WPF 注册表设置

除了可通过“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 Control Overviews and Tutorials(WebBrowser 控件概述和教程)。

注意注意

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

如果使用 WPF WebBrowser 控件来承载不受信任的 Web 内容,则应用程序应使用部分信任的 AppDomain 来帮助将应用程序代码与潜在的恶意 HTML 脚本代码隔离。 如果应用程序使用 InvokeScript 方法和 ObjectForScripting 属性与承载的脚本交互,则情况尤为如此。 有关更多信息,请参见 WPF 外接程序概述

如果应用程序使用 WPF WebBrowser 控件,则提高安全性和减轻攻击的另一种方法是启用 Internet Explorer 功能控制。 功能控制是 Internet Explorer 的新增功能,使管理员和开发人员能够配置承载 WebBrowser ActiveX 控件的 Internet Explorer 和应用程序的功能,该控件包装在 WPF WebBrowser 控件中。 可通过使用 CoInternetSetFeatureEnabled 函数或更改注册表中的值来配置功能控制。 有关功能控制的更多信息,请参见 Introduction to Feature Controls(功能控制简介)和 Internet Feature Controls(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 主机安全性的一般性建议做出的。有关更多信息,请参见 The MSHTML Host Security FAQ: Part I of II(MSHTML 主机安全性常见问题:第 I 部分/共 II 部分)和 The MSHTML Host Security FAQ: Part II of 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 browser application (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 控件也在保护模式下运行。 有关保护模式的更多信息,请参见 Understanding and Working in Protected Mode Internet Explorer(了解保护模式和在保护模式下使用 Internet Explorer)。

注意注意

如果尝试在 Firefox 中运行包括 WPF WebBrowser 控件的 XBAP,尽管在 Internet 区域中,也会引发 SecurityException。这是 WPF 安全策略造成的。

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

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

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

WPF 提供了一种机制,可以通过该机制对部分信任的 XBAPs 禁用 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 为启用。

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

注意注意

由于核心的 .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="https://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 应用程序的附加资源:

区域

资源

托管代码

Patterns and Practices Security Guidance for Applications(应用程序的模式和实践安全指南)

CAS

代码访问安全性

ClickOnce

ClickOnce 安全和部署

WPF

WPF 部分信任安全

请参见

概念

WPF 部分信任安全

WPF 安全策略 — 平台安全性

WPF 安全策略 — 安全工程

代码访问安全性

ClickOnce 安全和部署

XAML 概述 (WPF)

其他资源

Patterns and Practices Security Guidance for Applications