共用方式為


安全性 (WPF)

開發 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 瀏覽器裝載的應用程式預設會在部分信任安全性沙箱內執行,其限制為預設 CAS因特網 區域許可權集合。 這可有效地將由瀏覽器裝載的 WPF 應用程式與用戶端電腦隔離,就如同您對一般 Web 應用程式被隔離的期望一樣。 XBAP 可以根據部署 URL 的安全性區域和用戶端的安全性組態,將許可權提高到完全信任。 如需詳細資訊,請參閱 WPF 部分信任安全性

本主題討論 Windows Presentation Foundation (WPF) 獨立和瀏覽器裝載應用程式的安全性模型。

本主題包含下列幾節:

安全流覽

針對 XBAP,WPF 會區分兩種類型的瀏覽:應用程式和瀏覽器。

應用程式導覽 是在瀏覽器所裝載之應用程式內的內容專案之間流覽。 瀏覽器的導航 是指會變更瀏覽器本身內容和位址 URL 的導航。 應用程式瀏覽 (通常是 XAML) 與瀏覽器瀏覽 (通常是 HTML) 之間的關聯性如下圖所示:

應用程式瀏覽與瀏覽器瀏覽之間的關聯性。

XBAP 可流覽的安全性內容類型主要取決於是使用應用程式流覽還是瀏覽器流覽。

應用程式瀏覽安全性

如果可以使用套件 URI 來識別應用程式導覽,則應用程式瀏覽會被視為安全,其支援四種類型的內容:

內容類型 說明 URI 範例
資源 已新增至專案且組建類型為 Resource 的檔案。 pack://application:,,,/MyResourceFile.xaml
內容 已新增至建置類型為內容的項目的檔案。 pack://application:,,,/MyContentFile.xaml
來源網站 已新增至專案且組建類型為 None 的檔案。 pack://siteoforigin:,,,/MySiteOfOriginFile.xaml
應用程式程式碼 具有具編譯後代碼的 XAML 資源。

-或-

已新增至具有 Page組建類型的專案的 XAML 檔案。
pack://application:,,,/MyResourceFile .xaml

備註

如需應用程式資料檔和套件 URI 的詳細資訊,請參閱 WPF 應用程式資源、內容和資料檔

使用者可以或以程式設計方式瀏覽這些內容類型的檔案:

  • 用戶流覽。 用戶按下 Hyperlink 元素即可操作。

  • 程式化導航。 例如,藉由設定 NavigationWindow.Source 屬性,應用程式會巡覽而不涉及使用者。

瀏覽器瀏覽安全性

只有在下列情況下,瀏覽器流覽才會被視為安全:

  • 用戶流覽。 用戶藉由單擊位於主要 Hyperlink 中的 NavigationWindow 元素來巡覽,而不是在巢狀 Frame 中。

  • 區域。 所瀏覽的內容位於因特網或近端內部網路。

  • 通訊協定。 所使用的通訊協議為 HTTPHTTPsfilemailto

如果 XBAP 嘗試以不符合這些條件的方式瀏覽至內容,則會拋出 SecurityException

網頁瀏覽軟體安全性設定

您電腦上的安全性設定會決定授與任何網頁瀏覽軟體的存取權。 網頁瀏覽軟體包含任何使用 WinINetUrlMon API 的應用程式或元件,包括 Internet Explorer 和 PresentationHost.exe。

Internet Explorer 提供一種機制,可讓您設定透過或從 Internet Explorer 執行的功能,包括以下內容:

  • .NET Framework 相依元件

  • ActiveX 控制件和外掛程式

  • 下載

  • 腳本

  • 使用者驗證

您可以透過這種方式保護的功能集合會針對 因特網內部網路信任的網站受限制的網站 區域,以每個區域為基礎進行設定。 下列步驟說明如何設定安全性設定:

  1. 開啟 [ 控制台]。

  2. 按兩下 [網络和因特網 ],然後按兩下 [ 因特網選項]。

    此時會出現 [網際網路選項] 對話方塊。

  3. 在 [ 安全性] 索引標籤上,選取要為其設定安全性設定的區域。

  4. 按兩下 [自定義層級] 按鈕。

    [ 安全性設定 ] 對話框隨即出現,您可以設定所選區域的安全性設定。

    顯示 [安全性設定] 對話框的螢幕快照。

備註

您也可以從 Internet Explorer 取得 [因特網選項] 對話框。 按兩下 [工具 ],然後按兩下 [ 因特網選項]。

從 Windows Internet Explorer 7 開始,包含下列特別適用於 .NET Framework 的安全性設定:

  • 鬆散的 XAML。 控制 Internet Explorer 是否可以巡覽至獨立的 XAML 檔案。 (啟用、停用和提示選項)。

  • XAML 瀏覽器應用程式。 控制 Internet Explorer 是否可以瀏覽並執行 XBAP。 (啟用、停用和提示選項)。

根據預設,這些設定全都針對 因特網近端內部網路信任的網站 區域啟用,並針對 [限制的網站 ] 區域停用。

除了可透過因特網選項取得的安全性設定之外,還有下列登錄值可供選擇性地封鎖一些安全性敏感性 WPF 功能。 這些值定義於下列索引鍵底下:

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

下表列出可設定的值。

數值名稱 值類型 數值資料
XBAPDisallow REG_DWORD 1 表示不允許;0 表示允許。
鬆散Xaml禁止 REG_DWORD 1 表示不允許;0 表示允許。
瀏覽器禁止 REG_DWORD 1 表示不允許;0 表示允許。
禁止媒體音訊 REG_DWORD 1 表示不允許;0 表示允許。
媒體圖像禁止 REG_DWORD 1 表示不允許;0 表示允許。
MediaVideoDisallow REG_DWORD 1 表示不允許;0 表示允許。
ScriptInteropDisallow REG_DWORD 1 表示不允許;0 表示允許。

WebBrowser 控件和功能控制件

WPF WebBrowser 控件可用來裝載 Web 內容。 WPF WebBrowser 控件會包裝基礎 WebBrowser ActiveX 控件。 當您使用 WPF 控制項裝載不受信任的 Web 內容時,WPF WebBrowser 提供保護應用程式的一些支援。 不過,某些安全性功能必須由使用 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 的功能,以及裝載 WPF WebBrowser 控件所包裝之 WebBrowser ActiveX 控件的應用程式。 功能控件可以使用 CoInternetSetFeatureEnabled 函式或變更登錄中的值來設定。 如需功能控件的詳細資訊,請參閱 功能控件因特網功能控件簡介。

如果您要開發使用 WPF 控制件的獨立 WPF WebBrowser 應用程式,WPF 會自動為您的應用程式啟用下列功能控制項。

功能控制件
FEATURE_MIME_HANDLING
FEATURE_MIME_SNIFFING (MIME類型偵測功能)
功能物件快取
FEATURE_SAFE_BINDTOOBJECT
FEATURE_WINDOW_RESTRICTIONS
特徵區域高程
功能_限制_檔案下載
FEATURE_RESTRICT_ACTIVEXINSTALL
功能插件管理
FEATURE_HTTP_USERNAME_PASSWORD_DISABLE
FEATURE_SECURITYBAND
FEATURE_UNC_SAVEDFILECHECK
功能_驗證_導航_URL
FEATURE_DISABLE_TELNET_PROTOCOL
功能_WEBOC_彈出管理
功能_禁用_傳統壓縮
FEATURE_SSLUX

由於這些功能控制件會無條件地啟用,因此完全信任的應用程式可能會受到其損害。 在此情況下,如果特定應用程式及其裝載的內容沒有安全性風險,則可以停用對應的功能控件。

功能控件是由具現化 WebBrowser ActiveX 對象的程式所套用。 因此,如果您要建立可巡覽至不受信任的內容的獨立應用程式,您應該認真考慮啟用其他功能控制件。

備註

這項建議是以 MSHTML 和 SHDOCVW 主機安全性的一般建議為基礎。 如需詳細資訊,請參閱 MSHTML 主機安全性常見問題:II 的第一部分MSHTML 主機安全性常見問題:第二部分

針對可執行檔,請考慮將登錄值設定為 1,以啟用下列功能控制項。

功能控制件
功能_ACTIVEX_重定目的偵測
特徵區塊_LMZ_圖像
FEATURE_BLOCK_LMZ_OBJECT
FEATURE_BLOCK_LMZ_SCRIPT
功能_限制_RES_到_LMZ
特性限制於IE7版的ABOUT協定
顯示應用程式協議警告對話框功能
FEATURE_LOCALMACHINE_LOCKDOWN
強制地址和狀態功能
當檔案未找到時限制區域功能

針對可執行檔,請考慮將登錄值設定為 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

備註

如果您嘗試在 Firefox 中執行包含 WPF WebBrowser 控制項的 XBAP,且在網際網路區域中運行,則會擲回 SecurityException。 這是因為 WPF 安全策略。

停用旨在部分信任用戶端應用程式的APTCA程序集

當 Managed 組件安裝到全域組件快取(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 表示啟用。

如果必須為部分信任的客戶端應用程式停用組件,您可以撰寫可建立登錄機碼和值的更新。

備註

核心 .NET Framework 元件不會透過這種方式停用它們而受到影響,因為受控應用程式需要它們才能執行。 停用APTCA元件的支援主要以第三方應用程式為目標。

鬆散 XAML 檔案的沙箱行為

獨立的 XAML 檔案是僅包含標記的 XAML 檔案,不依賴任何後置程式碼、事件處理程式或應用程式特定元件。 從瀏覽器直接流覽至鬆散的 XAML 檔案時,會根據預設因特網區域許可權集,在安全性沙盒中載入它們。

不過,當在獨立應用程式中,鬆散的 XAML 檔案透過 NavigationWindowFrame 被導航時,安全行為會有所不同。

在這兩種情況覽至的鬆散 XAML 檔案會繼承其主應用程式的許可權。 不過,從安全性觀點來看,這種行為可能不理想,特別是如果鬆散的 XAML 檔案是由不受信任或未知的實體所產生。 這種類型的內容稱為外部內容,而且FrameNavigationWindow可以設定為在巡覽至 時加以隔離。 將 SandboxExternalContent 屬性設定為 true 來達成隔離,如 和 Frame的下列範例NavigationWindow所示:

<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>

使用此設定,外部內容將會載入與裝載應用程式之進程分開的進程。 此程式僅限於預設因特網區域許可權集合,有效地將它與主控應用程式和用戶端計算機隔離。

備註

即使從 NavigationWindowFrame 獨立應用程式中流覽至鬆散的 XAML 檔案,還是會根據 WPF 瀏覽器裝載基礎結構來實作,但安全性層級會略低於直接在 Windows Vista 和 Windows 7 上的 Internet Explorer 中載入內容時的安全性層級(這仍會透過 PresentationHost)。 這是因為使用網頁瀏覽器的獨立 WPF 應用程式不提供 Internet Explorer 的其他受保護模式安全性功能。

開發可提升安全性的 WPF 應用程式資源

以下是一些額外的資源,可協助開發可提升安全性的 WPF 應用程式:

面積 資源
受管理的程式碼 應用程式的架構與實務安全性指引
中國科學院 程式碼存取安全性
ClickOnce(單擊即運行) ClickOnce 安全性和部署
WPF(Windows Presentation Foundation) WPF 部分信任安全性

另請參閱