开发 Windows Presentation Foundation(WPF)独立应用程序和浏览器托管的应用程序时,必须考虑安全模型。 WPF 独立应用程序使用不受限制的权限(CASFullTrust 权限集)执行,无论是使用 Windows Installer(.msi)、XCopy 还是 ClickOnce 进行部署。 不支持使用 ClickOnce 部署部分信任的独立 WPF 应用程序。 但是,完全信任的主机应用程序可以使用 .NET Framework 插件模型创建部分信任 AppDomain 。 有关详细信息,请参阅 WPF Add-Ins 概述。
WPF 浏览器托管的应用程序由 Windows Internet Explorer 或 Firefox 托管,可以是 XAML 浏览器应用程序(XBAP)或松散的可扩展应用程序标记语言(XAML)文档。有关详细信息,请参阅 WPF XAML 浏览器应用程序概述。
警告
XBAP 要求旧版浏览器运行,例如 Internet Explorer 和旧版 Firefox。 这些较旧的浏览器通常在 Windows 10 和 Windows 11 上不受支持。 由于安全风险,新式浏览器不再支持 XBAP 应用所需的技术。 不再支持启用 XBAP 的插件。 有关详细信息,请参阅 有关 WPF 浏览器托管应用程序(XBAP)的常见问题解答。
默认情况下,WPF 浏览器托管的应用程序在部分信任安全沙盒中执行,该沙盒仅限于默认的 CASInternet 区域权限集。 这种方式有效地将 WPF 浏览器托管的应用程序与客户端计算机隔离,就像您期待的那样,典型的 Web 应用程序会被隔离。 根据部署 URL 的安全区域和客户端的安全配置,XBAP 可以提升权限(最高为完全信任)。 有关详细信息,请参阅 WPF 部分信任安全性。
本主题讨论 Windows Presentation Foundation(WPF)独立应用程序和浏览器托管应用程序的安全模型。
本主题包含以下部分:
安全导航
对于 XBAP,WPF 区分两种类型的导航:应用程序和浏览器。
应用程序导航 是在浏览器托管的应用程序内内容项之间导航。 浏览器导航 是更改浏览器本身的内容和位置 URL 的导航。 应用程序导航(通常为 XAML)和浏览器导航(通常是 HTML)之间的关系如下图所示:
XBAP 导航到的被视为安全的内容类型主要取决于使用应用程序导航还是浏览器导航。
应用程序导航安全性
如果应用程序导航可以使用包 URI 进行标识,则应用程序导航被视为安全,该 URI 支持四种类型的内容:
内容类型 | DESCRIPTION | URI 示例 |
---|---|---|
资源 | 具有生成类型 资源 的项目中添加的文件。 | pack://application:,,,/MyResourceFile.xaml |
内容 | 添加到项目中的、生成类型为 内容 的文件。 | pack://application:,,,/MyContentFile.xaml |
源站点 | 添加到生成类型为 None 的项目的文件。 | pack://siteoforigin:,,,/MySiteOfOriginFile.xaml |
应用程序代码 | 具有编译后的后台代码的 XAML 资源。 -或- 具有 页面生成类型的项目中添加的 XAML 文件。 |
pack://application:,,,/MyResourceFile
.xaml
|
注释
有关应用程序数据文件和包 URI 的详细信息,请参阅 WPF 应用程序资源、内容和数据文件。
用户可以或以编程方式导航到这些内容类型的文件:
用户导航。 用户通过单击 Hyperlink 元素进行导航。
编程导航。 例如,应用程序通过设置 NavigationWindow.Source 属性来导航而不涉及用户。
浏览器导航安全性
仅在以下情况下,浏览器导航被视为安全:
用户导航。 用户通过点击位于主 NavigationWindow 元素内的 Hyperlink 元素,而不是嵌套的 Frame 元素来进行导航。
区域。 要导航到的内容位于 Internet 或本地 Intranet 上。
协议。 正在使用的协议是 http、https、文件或 mailto。
如果 XBAP 尝试以不符合这些条件的方式导航到内容,则会引发 SecurityException。
Web 浏览软件安全设置
计算机上的安全设置决定了任何网页浏览软件所获得的访问权限。 Web 浏览软件包括任何使用 WinINet 或 UrlMon API 的应用程序或组件,包括 Internet Explorer 和 PresentationHost.exe。
Internet Explorer 提供一种机制以配置允许从或在 Internet Explorer 中执行的功能,包括以下内容:
.NET Framework 依赖组件
ActiveX 控件和插件
下载
脚本编写
用户身份验证
可以采用这种方式保护的功能集合是按区域为 Internet、 Intranet、 受信任站点和 受限站点 区域配置的。 以下步骤介绍如何配置安全设置:
打开“控制面板”。
单击“ 网络”和“Internet ”,然后单击“ Internet 选项”。
将显示“Internet 选项”对话框。
在“ 安全 ”选项卡上,选择要为其配置安全设置的区域。
单击“ 自定义级别 ”按钮。
此时会显示“ 安全设置” 对话框,可以为所选区域配置安全设置。
注释
还可以从 Internet Explorer 访问“Internet 选项”对话框。 单击 “工具 ”,然后单击“ Internet 选项”。
从 Windows Internet Explorer 7 开始,包括以下专用于 .NET Framework 的安全设置:
非封装的 XAML。 控制 Internet Explorer 是否可以导航到独立的 XAML 文件。 (启用、禁用和提示选项)。
XAML 浏览器应用程序。 控制 Internet Explorer 是否可以导航到并运行 XBAP。 (启用、禁用和提示选项)。
默认情况下,这些设置都为 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 允许。 |
禁止使用网络浏览器 | REG_DWORD | 1 表示禁止;0 允许。 |
媒体音频禁用 | REG_DWORD | 1 表示禁止;0 允许。 |
禁止媒体图像 | REG_DWORD | 1 表示禁止;0 允许。 |
MediaVideoDisallow | REG_DWORD | 1 表示禁止;0 允许。 |
脚本互操作禁止 | 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 Add-Ins 概述。
如果应用程序使用 WPF WebBrowser 控件,则增加安全性和缓解攻击的另一种方法是启用 Internet Explorer 功能控件。 功能控件是为 Internet Explorer 增加的功能,它使管理员和开发人员能够配置 Internet Explorer 的功能,以及托管 WebBrowser ActiveX 控件(由 WPF WebBrowser 控件包装)的应用程序的功能。 可以使用 CoInternetSetFeatureEnabled 函数或更改注册表中的值来配置功能控件。 有关功能控件的详细信息,请参阅 功能控件 和 Internet 功能控件简介。
如果要开发使用 WPF 控件的独立 WPF WebBrowser 应用程序,WPF 会自动为应用程序启用以下功能控件。
功能控制 |
---|
MIME处理功能 |
MIME嗅探功能 |
FEATURE_OBJECT_CACHING |
功能_安全_绑定到对象 |
功能窗口限制 |
功能区海拔 |
限制文件下载功能 |
功能_限制_ActiveX安装 |
功能附加组件管理 |
HTTP用户名密码功能禁用 |
安全带功能 |
FEATURE_UNC_SAVEDFILECHECK |
功能_验证_导航_URL |
禁用Telnet协议功能 |
FEATURE_WEBOC_弹出管理 |
功能_禁用传统压缩 |
FEATURE_SSLUX |
由于这些功能控件是无条件启用的,因此完全信任的应用程序可能会受到这些控件的损害。 在这种情况下,如果特定应用程序及其托管的内容没有安全风险,则可以禁用相应的功能控制。
功能控制由实例化 WebBrowser ActiveX 对象的过程执行。 因此,如果要创建可导航到不受信任的内容的独立应用程序,则应认真考虑启用其他功能控件。
注释
此建议基于 MSHTML 和 SHDOCVW 主机安全性的一般建议。 有关详细信息,请参阅 MSHTML 主机安全常见问题解答:II 的第 I 部分 和 MSHTML 主机安全常见问题解答:II 的第 II 部分。
对于可执行文件,请考虑通过将注册表值设置为 1 来启用以下功能控件。
功能控制 |
---|
功能_ActiveX_用途检测 |
FEATURE_BLOCK_LMZ_IMG |
FEATURE_BLOCK_LMZ_OBJECT |
FEATURE_BLOCK_LMZ_SCRIPT |
FEATURE_RESTRICT_RES_TO_LMZ |
FEATURE_RESTRICT_ABOUT_PROTOCOL_IE7 |
显示应用协议警告对话框功能 |
本地机器锁定功能 |
FEATURE_FORCE_ADDR_AND_STATUS |
FEATURE_RESTRICTED_ZONE_WHEN_FILE_NOT_FOUND |
对于可执行文件,请考虑通过将注册表值设置为 0 来禁用以下功能控制。
特性控制 |
---|
启用脚本粘贴功能的URL操作(如果提示) |
如果在 Windows Internet Explorer 中运行包含 WPF WebBrowser 控件的部分信任 XAML 浏览器应用程序(XBAP),WPF 会在 Internet Explorer 进程的地址空间中托管 WebBrowser ActiveX 控件。 由于 WebBrowser ActiveX 控件托管在 Internet Explorer 进程中,因此 Internet Explorer 的所有功能控件也为 WebBrowser ActiveX 控件启用。
与普通独立应用程序相比,Internet Explorer 中运行的 XBAP 还会获得额外的安全性级别。 这种额外的安全性是因为 Internet Explorer(因此 WebBrowser ActiveX 控件)默认在 Windows Vista 和 Windows 7 上以受保护的模式运行。 有关受保护模式的详细信息,请参阅 了解和处理受保护的模式 Internet Explorer。
注释
如果在 Internet 区域内尝试在 Firefox 中运行包含 WPF WebBrowser 控件的 XBAP,将会引发 SecurityException 。 这是因为 WPF 安全策略。
为部分受信任的客户端应用程序禁用 APTCA 程序集
将托管程序集安装到全局程序集缓存(GAC)中时,它们会变得完全受信任,因为用户必须提供显式权限才能安装它们。 由于它们完全受信任,因此只有完全受信任的托管客户端应用程序才能使用它们。 若要允许部分受信任的应用程序使用它们,必须将它们标记为APTCA。 只有经过测试证明在部分信任中执行是安全的程序集,才应标记此属性。
但是,APTCA 程序集在安装到 GAC 后可能会表现出安全漏洞。 发现安全漏洞后,程序集发布者可以生成安全更新来修复现有安装上的问题,并防止发现问题后可能发生的安装。 更新的一个选项是卸载程序集,尽管这可能会中断使用程序集的其他完全受信任的客户端应用程序。
WPF 提供了一种机制,通过该机制,可以在不卸载 APTCA 程序集的情况下为部分受信任的 XBAP 禁用 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 区域权限集的安全沙盒中加载。
但是,在从独立应用程序或Frame独立应用程序中导航到NavigationWindow松散 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 区域权限集,从而有效地将其与宿主应用程序和客户端计算机隔离开来。
注释
尽管基于 WPF 浏览器托管基础结构(涉及 PresentationHost 进程)实现从 NavigationWindow 或 Frame 独立应用程序中导航至松散的 XAML 文件,但其安全级别略低于在 Windows Vista 和 Windows 7 上通过 Internet Explorer 直接加载内容时的安全级别(同样通过 PresentationHost 实现)。 这是因为使用 Web 浏览器的独立 WPF 应用程序不提供 Internet Explorer 的其他受保护模式安全功能。
用于开发提升安全性的 WPF 应用程序的资源
下面是一些其他资源,可帮助开发提升安全性的 WPF 应用程序:
面积 | 资源 |
---|---|
托管代码 | 应用程序的模式和做法安全指南 |
CAS | 代码访问安全性 |
ClickOnce | ClickOnce 安全和部署 |
WPF(Windows Presentation Foundation) | WPF 部分信任安全 |