共用方式為


Windows Forms 中的其他安全性考量

.NET Framework 安全性設定可能會導致應用程式在部分信任環境中執行,而不是在本機計算機上執行。 .NET Framework 會限制存取檔案系統、網路和非受控 API 等重要本機資源的存取權。 安全性設定會影響呼叫 Microsoft Windows API 或其他安全性系統無法驗證的 API 的能力。 安全性也會影響應用程式的其他層面,包括檔案和資料存取及列印。 如需在部分信任環境中存取檔案和資料的詳細資訊,請參閱 Windows Forms 中更安全的檔案和資料存取。 如需在部分信任環境中列印的詳細資訊,請參閱 Windows Forms 中更安全的列印

下列各節將討論如何使用剪貼簿、執行視窗操作,以及從部分信任環境中執行的應用程式呼叫 Windows API。

剪貼簿存取

UIPermission 類別會控制剪貼簿的存取權,且相關聯的 UIPermissionClipboard 列舉值表示存取等級。 下表顯示可能的權限層級。

UIPermissionClipboard 值 描述
AllClipboard 可以不受限制使用剪貼簿。
OwnClipboard 可以在受到部分限制下使用剪貼簿。 能夠不受限制將資料放在剪貼簿 (複製或剪下命令作業)。 接受貼上的內建控制項 (例如文字方塊) 可以接受剪貼簿資料,但無法以程式設計方式從剪貼簿讀取使用者控制項。
NoClipboard 無法使用剪貼簿。

根據預設,區域內部網路區域會獲得 AllClipboard 存取,而網際網路區域會獲得 OwnClipboard 存取。 這表示應用程式可以將資料複製到剪貼簿,但應用程式無法以程式設計方式在剪貼簿中貼上或讀取。 這些限制會防止未受完全信任的程式讀取另一個應用程式複製到剪貼簿的內容。 如果您的應用程式需要完整的剪貼簿存取,但您沒有權限,您必須提高應用程式的權限。 如需提高權限的詳細資訊,請參閱一般安全性原則管理

視窗操作

UIPermission 類別也會控制執行視窗操作和其他UI相關動作的權限,且相關聯的 UIPermissionWindow 列舉值表示存取等級。 下表顯示可能的權限層級。

根據預設,區域內部網路區域會獲得 AllClipboard 存取,而網際網路區域會獲得 OwnClipboard 存取。 這表示在網際網路區域中,應用程式可以執行大部分的視窗和 UI 動作,但視窗的外觀會經過修改。 修改過的視窗會在第一次執行時顯示氣球通知、包含修改過的標題列文字,而且在標題列上需要有關閉按鈕。 氣球通知和標題列讓應用程式的使用者知道,應用程式正在部分信任下執行。

UIPermissionWindow 值 描述
AllWindows 使用者可以無限制使用所有視窗和使用者輸入事件。
SafeTopLevelWindows 使用者只能使用較安全的最上層視窗和較安全的子視窗來繪圖,且只能使用這些最上層視窗和子視窗內之使用者介面的使用者輸入事件。 這些較安全的視窗有清楚的標籤,也有大小上限和下限的限制。 這些限制可防止潛在的有害詐騙攻擊,例如模仿系統登入畫面或系統桌面,並限制以程序設計方式存取父視窗、焦點相關 API,以及使用 ToolTip 控制項,
SafeSubWindows 使用者只能使用較安全的子視窗來繪圖,且只能使用該子視窗內之使用者介面的使用者輸入事件。 瀏覽器內顯示的控制項即為較安全子視窗的一個例子。
NoWindows 使用者無法使用任何視窗或使用者介面事件。 無法使用任何使用者介面。

UIPermissionWindow 列舉所識別的每個權限等級,允許的動作會比上一個等級少。 下表指出 SafeTopLevelWindowsSafeSubWindows 值所限制的動作。 如果每個成員所需的確切權限,請參閱 .NET Framework Class Library 文件中該成員的參考。

SafeTopLevelWindows 權限會限制下表所列的動作。

元件 受限制的動作
Application - 設定 SafeTopLevelCaptionFormat 屬性。
Control - 取得 Parent 屬性。
- 設定 SafeTopLevelCaptionFormat 屬性。
- 呼叫 FindFormFocusFromChildHandleFromHandlePreProcessMessageReflectMessageSetTopLevel 方法。
- 如果傳回的控制項不是呼叫控制項的子系,則呼叫 GetChildAtPoint 方法。
- 修改容器控制項內的控制項焦點。
Cursor - 設定 SafeTopLevelCaptionFormat 屬性。
- 呼叫 Hide 方法。
DataGrid - 呼叫 Hide 方法。
Form - 取得 ActiveFormMdiParent 屬性。
- 設定 ControlBoxShowInTaskbarTopMost 屬性。
- 將 Opacity 屬性設定為低於 50%。
- 以程式設計方式將 WindowState 屬性設定為 Minimized
- 呼叫 Hide 方法。
- 使用 NoneFixedToolWindowSizableToolWindowFormBorderStyle 列舉值。
NotifyIcon - 完全限制使用 NotifyIcon 元件。

除了 SafeTopLevelWindows 值所設定的限制之外,SafeSubWindows 值也會限制下表所列的動作。

元件 受限制的動作
CommonDialog - 顯示衍生自 CommonDialog 類別的對話方塊。
Control - 呼叫 Hide 方法。
- 設定 SafeTopLevelCaptionFormat 屬性。
Cursor - 設定 SafeTopLevelCaptionFormat 屬性。
MessageBox - 呼叫 Hide 方法。

裝載協力廠商控制項

如果您的表單裝載協力廠商控制項,可能會有另一種視窗操作。 第三方控制項是您並未自行開發及編譯的任何自訂 UserControl。 雖然很難入侵裝載情節,但在理論上,協力廠商控制項有可能展開其呈現表面來涵蓋表單的整個區域。 接著,此控制項可模擬重要的對話方塊,然後向您的使用者要求資訊,例如使用者名稱/密碼組合或銀行帳戶號碼。

為了限制這種潛在風險,請只使用您信任的廠商的協力廠商控制項。 如果您使用的協力廠商控制項是從未驗證的來源下載,建議您檢閱原始程式碼中潛在的弱點。 在確認來源沒有惡意之後,您應該自行編譯組件,以確保來源符合組件。

Windows API 呼叫

如果您的應用程式設計需要從 Windows API 呼叫函式,您會存取非受控程式碼。 在此情況下,當您使用 Windows API 呼叫或值時,無法判斷程式碼對視窗或作業系統的動作。 SecurityPermission 類別和 SecurityPermissionFlag 列舉的 UnmanagedCode 值會控制對非受控程式碼的存取。 應用程式只有在授予 UnmanagedCode 權限時,才能存取非受控程式碼。 根據預設,只有在本機執行的應用程式才能呼叫 Unmanaged 程式碼。

某些 Windows Forms 成員提供需要 UnmanagedCode 權限的非受控存取權。 下表列出 System.Windows.Forms 命名空間中需要權限的成員。 如需成員所需權限的詳細資訊,請參閱 .NET Framework Class Library 文件。

元件 member
Application - AddMessageFilter 方法
- CurrentInputLanguage 屬性
- AddMessageFilter 方法
- AddMessageFilter 方法
- ThreadException 事件
CommonDialog - AddMessageFilter 方法
- OwnerWndProc\ 方法
- AddMessageFilter 方法
- AddMessageFilter 方法
Control - AddMessageFilter 方法
- AddMessageFilter 方法
- AddMessageFilter 方法
- AddMessageFilter 方法
Help - ShowHelp 方法
- AddMessageFilter 方法
NativeWindow - NativeWindow 類別
Screen - AddMessageFilter 方法
SendKeys - AddMessageFilter 方法
- AddMessageFilter 方法

如果您的應用程式沒有呼叫非受控程式碼的權限,您的應用程式必須要求 UnmanagedCode 權限,或者您必須考慮實作功能的替代方式;在許多情況下,Windows Forms 提供 Windows API 函式的受控替代方案。 如果沒有替代做法,但應用程式必須存取 Unmanaged 程式碼,您必須提高應用程式的權限。

呼叫 Unmanaged 程式碼的權限可讓應用程式執行大部分的動作。 因此,呼叫 Unmanaged 程式碼的權限應該只授與來自受信任來源的應用程式。 另外,視應用程式而定,應用程式功能中會呼叫 Unmanaged 程式碼的部分可以是選擇性,或只在完全信任環境中啟用。 如需危險性權限的詳細資訊,請參閱危險性權限和原則管理。 如需提高權限的詳細資訊,請參閱一般安全性原則管理

另請參閱