Windows Forms 中的其他安全性考量

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

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

剪貼簿存取

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

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

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

視窗操作

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

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

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

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

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

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

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

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

裝載協力廠商控制項

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

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

Windows API 呼叫

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

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

元件 member
Application - AddMessageFilter 方法
- CurrentInputLanguage 屬性
- Exit 方法
- ExitThread 方法
- ThreadException 事件
CommonDialog - HookProc 方法
- OwnerWndProc\方法
- Reset 方法
- RunDialog 方法
Control - CreateParams 方法
- DefWndProc 方法
- DestroyHandle 方法
- WndProc 方法
Help - ShowHelp 方法
- ShowHelpIndex 方法
NativeWindow - NativeWindow 類別
Screen - FromHandle 方法
SendKeys - Send 方法
- SendWait 方法

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

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

另請參閱