Windows Form 中的安全性概觀

在 .NET Framework 發行之前,使用者電腦上執行的所有程式碼都有與電腦使用者擁有的資源相同的許可權或許可權。 例如,如果使用者可以存取檔案系統,程式碼就可以存取檔案系統,如果使用者可以存取某個資料庫,程式碼就可以存取該資料庫。 就使用者明確安裝在本機電腦上的可執行檔中的程式碼而言,也許這些權限是可接受的,但是就來自網際網路或近端內部網路的潛在惡意程式碼而言,可能就無法接受了。 不應該讓這個程式碼在沒有權限的情況下,存取使用者的電腦資源。

.NET Framework 引進了稱為「程式碼存取安全性」的基礎結構,可讓您區分程式碼具有的許可權或許可權,與使用者擁有的許可權。 根據預設,來自網際網路及內部網路的程式碼,只能在所謂部分信任的環境中執行。 部分信任會使應用程式遵守一系列的限制,例如,限制應用程式不能存取本機硬碟,且無法執行 Unmanaged 程式碼等等。 .NET Framework 會根據該程式碼的身分識別控制允許存取的資源:其來源、是否有 強式名稱元件 、是否使用憑證簽署等等。

ClickOnce 技術可用來部署 Windows Forms 應用程式,可協助您更輕鬆地開發在部分信任中執行的應用程式、完全信任或具有更高許可權的部分信任。 ClickOnce 提供許可權提升和信任的應用程式部署等功能,讓您的應用程式能夠以負責任的方式向本機使用者要求完全信任或提高許可權。

了解 .NET Framework 中的安全性

程式碼存取安全性可依據程式碼的來源,以及程式碼其他方面的身分識別,提供程式碼各種程度的信任等級。 如需 Common Language Runtime 用來判斷安全性原則的辨識項相關資訊,請參閱辨識項。 它可以幫助保護電腦系統不受惡意程式碼的威脅,並幫助防止受信任的程式碼有意或無意地危及安全性。 程式碼存取安全性也讓您更充分掌控您的應用程式可以執行哪些動作,因為您可以只指定您要讓應用程式擁有的那些權限。 程式碼存取安全性會影響以 Common Language Runtime 為目標的所有 Managed 程式碼,即使該程式碼沒有進行單一程式碼存取安全性權限檢查也一樣。 如需 .NET Framework 中安全性的詳細資訊,請參閱 重要安全性概念和 程式碼存取安全性基本概念

如果使用者不透過 Web 伺服器或檔案共用,而直接執行 Windows Form 可執行檔,則授與應用程式的信任層級,取決於程式碼所在的位置,以及其啟動方式。 當應用程式執行時,會自動受到評估,並且會從 Common Language Runtime 收到具名權限集合。 根據預設,來自本機電腦的程式碼會被授與完全信任權限集合,來自區域網路的程式碼會被授與近端內部網路權限集合,而來自網際網路的程式碼會被授與網際網路權限集合。

注意

在 .NET Framework 1.0 版 Service Pack 1 和 Service Pack 2 中,網際網路區功能變數代碼群組會收到 Nothing 許可權集合。 在 .NET Framework 的其他所有版本中,網際網路區功能變數代碼群組會收到網際網路許可權集合。

各權限集合中授與的預設權限詳列於預設安全性原則主題中。 根據應用程式接收的權限,它會正確執行,或是產生安全性例外狀況。

許多 Windows Forms 應用程式將會使用 ClickOnce 進行部署。 用來產生 ClickOnce 部署的工具與先前討論的安全性預設值不同。 如需詳細資訊,請參閱下列討論:

授與應用程式的實際權限可能不同於預設值,因為安全性原則是可以修改的,這表示您的應用程式可能在某部電腦上具有權限,而在另一部電腦上則沒有。

開發更安全的 Windows Form 應用程式

在應用程式開發的所有步驟中,安全性都很重要。 一開始請先檢閱並遵循安全程式碼撰寫方針

接著,決定您的應用程式必須在完全信任中執行,或是應該在部分信任中執行。 以完全信任來執行您的應用程式,比較容易存取本機電腦上的資源,但是如果沒有嚴格遵守<安全程式碼撰寫方針>主題來設計及開發您的應用程式,就會讓您的應用程式及其使用者暴露在高度的安全性風險中。 以部分信任來執行您的應用程式,比較容易開發較安全的應用程式,並大幅降低風險,但是需要詳細規劃如何實作特定功能。

如果您選擇部分信任 (也就是網際網路或近端內部網路權限集合),請決定您想要讓應用程式如何在此環境中運作。 Windows Form 提供更安全的替代方式,可在非完全信任的環境中實作功能。 針對部分信任和完全信任的環境,都可以用不同方式來設計和撰寫應用程式的某些部分,例如資料存取。 某些 Windows Form 功能 (例如應用程式設定) 是為了在部分信任中運作而設計。 如需詳細資訊,請參閱應用程式設定概觀

如果您的應用程式所需的權限,超出部分信任的限制,但是您不想要在完全信任中執行,您可以在部分信任中執行,並且只確立您需要的那些額外權限。 例如,如果您想要在部分信任中執行,但必須為您的應用程式授與使用者檔案系統上之目錄的唯讀存取權,您可以只針對該目錄要求 FileIOPermission。 如果正確使用,這種方法可以給予應用程式更多功能,並且讓使用者的安全性風險降到最低。

當您開發要在部分信任中執行的應用程式時,請追蹤應用程式必須執行的權限,以及應用程式可以選擇性使用的權限。 在已知所有權限的情況下,您應針對應用程式層級的權限提出宣告式要求。 要求許可權會通知 .NET Framework 執行時間您的應用程式需要哪些許可權,以及它特別不希望的許可權。 如需有關要求權限的詳細資訊,請參閱要求權限

當您要求選擇性權限時,您必須處理當應用程式執行的動作需要未被授與的權限時,所產生的安全性例外狀況。 適當處理 SecurityException 可確保您的應用程式能夠繼續運作。 您的應用程式可以使用例外狀況來判斷是否應該為使用者停用某功能。 例如,如果未授與必要的檔案權限,應用程式可以停用 [儲存] 功能表選項。

有時候,很難知道您是否已確立所有適當的權限。 比方說,表面上看起來無害的方法呼叫,可能會在其執行期間的某個時間點存取檔案系統。 如果您未以所有的必要權限來部署應用程式,在桌面上偵錯時,測試可能沒問題,但部署時可能會失敗。 .NET Framework 2.0 SDK 和 Visual Studio 2005 都包含用來計算應用程式所需許可權的工具:MT.exe 命令列工具和 Visual Studio 的 [計算許可權] 功能。

下列主題說明其他 Windows Form 安全性功能。

主題 說明
- Windows Forms 中更安全的檔案和資料存取 說明如何在部分信任的環境中存取檔案和資料。
- Windows Forms 中更安全的列印 說明如何在部分信任的環境中存取列印功能。
- Windows Forms 中的其他安全性考量 說明如何在部分信任的環境中執行視窗操作、使用剪貼簿,以及呼叫 Unmanaged 程式碼。

使用適當的權限部署應用程式

將 Windows Forms 應用程式部署至用戶端電腦的最常見方式是 ClickOnce,這是描述應用程式執行之所有元件所需的部署技術。 ClickOnce 會使用稱為資訊清單的 XML 檔案來描述組成應用程式的元件和檔案,以及應用程式所需的許可權。

ClickOnce 有兩種技術可要求用戶端電腦上提高的許可權。 這兩種技術都需要使用 Authenticode 憑證。 該憑證有助於確保應用程式的使用者是來自受信任的來源。

下表將描述這些技術。

提高權限技術 描述
權限提高 在應用程式第一次執行時,會以安全性對話方塊來提示使用者。 [權限提高] 對話方塊會通知使用者是誰發行該應用程式,讓使用者能夠明智地決定是否要授與其額外的信任
受信任的應用程式部署 需要系統管理員在用戶端電腦上執行發行者 Authenticode 憑證的單次安裝。 從此之後,有簽署憑證的任何應用程式都會視為受信任,並且可以在本機電腦上以完全信任執行,而不會有其他提示。

您要選擇哪一種技術,將取決於您的部署環境。 如需詳細資訊,請參閱選擇 ClickOnce 部署策略

根據預設,使用 Visual Studio 或 .NET Framework SDK 工具 (Mage.exe 和 MageUI.exe) 部署的 ClickOnce 應用程式會設定為在具有完全信任的用戶端電腦上執行。 如果您在部署應用程式時,是使用部分信任,或是只有使用某些額外的權限,則必須變更這個預設值。 當您設定部署時,您可以使用 Visual Studio 或 .NET Framework SDK 工具 MageUI.exe 來執行此動作。 如需如何使用 MageUI.exe 的詳細資訊,請參閱 逐步解說:手動部署 ClickOnce 應用程式 。 另請參閱如何:設定 ClickOnce 應用程式的自訂權限如何:設定 ClickOnce 應用程式的自訂權限

如需 ClickOnce 和許可權提升安全性層面的詳細資訊,請參閱 保護 ClickOnce 應用程式 。 如需有關受信任的應用程式部署的詳細資訊,請參閱受信任的應用程式部署概觀

測試應用程式

如果您已使用 Visual Studio 部署 Windows Forms 應用程式,則可以從開發環境啟用部分信任或受限制許可權集合的偵錯。 另請參閱 如何:使用受限制的許可權 對 ClickOnce 應用程式進行偵錯。

另請參閱