Дополнительные вопросы безопасности в Windows Forms
Параметры безопасности .NET Framework могут привести к тому, что приложение будет работать по-разному в среде частичного доверия, чем на локальном компьютере. Платформа .NET Framework ограничивает доступ к таким критически важным локальным ресурсам, как файловая система, сеть и неуправляемые API, помимо прочего. Параметры безопасности влияют на возможность вызова API Microsoft Windows или других API, которые не могут быть проверены системой безопасности. Безопасность также влияет на другие аспекты приложения, включая доступ к файлам и данным, а также печать. Для получения дополнительных сведений о доступе к файлам и данным в среде с частичным доверием см. раздел «Более безопасный доступ к файлам и данным в Windows Forms». Дополнительные сведения о печати в среде частичного доверия см. в печати с повышенной безопасностью в Windows Forms.
В следующих разделах описывается, как работать с буфером обмена, выполнять операции с окнами и вызывать API Windows из приложений, работающих в среде частичного доверия.
Доступ к буферу обмена
Класс UIPermission управляет доступом к буферу обмена, а связанное значение перечисления UIPermissionClipboard указывает уровень доступа. В следующей таблице показаны возможные уровни разрешений.
Значение UIPermissionClipboard | Описание |
---|---|
AllClipboard | Буфер обмена можно использовать без ограничений. |
OwnClipboard | Буфер обмена можно использовать с некоторыми ограничениями. Возможность поместить данные в буфер обмена (операции копирования или вырезания) является неограниченной. Встроенные элементы управления, которые принимают вставку, такие как текстовое поле, могут обрабатывать данные из буфера обмена, но пользовательские элементы управления не могут программно считывать данные из буфера обмена. |
NoClipboard | Буфер обмена нельзя использовать. |
По умолчанию зона локальной интрасети получает доступ AllClipboard, а зона Интернета получает OwnClipboard доступ. Это означает, что приложение может копировать данные в буфер обмена, но приложение не может программным способом вставить или прочитать из буфера обмена. Эти ограничения препятствуют программам без полного доверия считывать содержимое, скопированное в буфер обмена другим приложением. Если вашему приложению требуется полный доступ к буферу обмена, но у вас нет необходимых разрешений, вам придется повысить уровень разрешений для вашего приложения. Дополнительные сведения о повышении разрешений см. в разделе Общая администрация политики безопасности.
Манипуляция окнами
Класс UIPermission также управляет разрешением на выполнение операций с окнами и других действий, связанных с пользовательским интерфейсом, а связанное значение перечисления UIPermissionWindow указывает уровень доступа. В следующей таблице показаны возможные уровни разрешений.
По умолчанию зона локальной интрасети получает доступ AllWindows, а зона Интернета получает SafeTopLevelWindows доступ. Это означает, что в зоне Интернета приложение может выполнять большинство действий в окне и пользовательском интерфейсе, но внешний вид окна будет изменен. В измененном окне отображается всплывающее уведомление при первом запуске, содержит измененный текст строки заголовка и требуется кнопка закрытия в строке заголовка. Всплывающее уведомление и строка заголовка сообщают пользователю приложения, что приложение выполняется с ограниченным доверием.
Значение UIPermissionWindow | Описание |
---|---|
AllWindows | Пользователи могут без ограничений использовать все окна и события ввода пользователя. |
SafeTopLevelWindows | Пользователи могут использовать только безопасные окна верхнего уровня и подокна для рисования, а для пользовательского интерфейса в этих окнах могут использоваться только события ввода пользователя. Эти безопасные окна четко помечены и имеют минимальные и максимальные ограничения размера. Ограничения предотвращают потенциально опасные атаки спуфинга, такие как имитация экранов входа в систему или рабочих столов системы, и ограничивают программный доступ к родительским окнам, API, связанным с фокусом, и использованию элемента управления ToolTip. |
SafeSubWindows | Пользователи могут использовать только более безопасные подокна для рисования и использовать только события ввода от пользователей для пользовательского интерфейса в этом подокне. Элемент управления, отображаемый в браузере, является примером более безопасного подокна. |
NoWindows | Пользователи не могут использовать какие-либо события окон или пользовательского интерфейса. Пользовательский интерфейс не может использоваться. |
Каждый уровень разрешений, определенный перечислением UIPermissionWindow, позволяет меньше действий, чем уровень над ним. В следующих таблицах указаны действия, ограниченные значениями SafeTopLevelWindows и SafeSubWindows. Точные разрешения, необходимые для каждого члена, см. в справочной документации по библиотеке классов .NET Framework.
SafeTopLevelWindows разрешение ограничивает действия, перечисленные в следующей таблице.
Компонент | Ограниченные действия |
---|---|
Application | — задание свойства SafeTopLevelCaptionFormat. |
Control | — Получение свойства Parent. — задание свойства Region .— вызов метода FindForm, Focus, FromChildHandle и FromHandle, PreProcessMessage, ReflectMessageили SetTopLevel. — Вызов метода GetChildAtPoint, если возвращенный элемент управления не является дочерним элементом вызывающего элемента управления. — Измените фокус элемента управления внутри контейнерного элемента управления. |
Cursor | — задание свойства Clip. — вызов метода Hide. |
DataGrid | — вызов метода ProcessTabKey. |
Form | — получение свойства ActiveForm или MdiParent. — задание свойства ControlBox, ShowInTaskbarили TopMost. Установка значения свойства Opacity ниже 50%. — установка свойства WindowState на Minimized программным способом. — вызов метода Activate. — Использование значений перечисления None, FixedToolWindowи SizableToolWindowFormBorderStyle. |
NotifyIcon | — Использование компонента NotifyIcon полностью ограничено. |
Значение SafeSubWindows ограничивает действия, перечисленные в следующей таблице, помимо ограничений, помещенных значением SafeTopLevelWindows.
Компонент | Ограниченные действия |
---|---|
CommonDialog | — Отображение диалогового окна, производного от класса CommonDialog. |
Control | — вызов метода CreateGraphics. — задание свойства Cursor. |
Cursor | — задание свойства Current. |
MessageBox | — вызов метода Show. |
Размещение сторонних элементов управления
Другой вид манипуляции с окном может произойти, если в формах размещаются сторонние элементы управления. Сторонний элемент управления — это любой пользовательский UserControl, который вы не разработали и не скомпилировали сами. Хотя сценарий размещения трудно использовать, теоретически это возможно для стороннего элемента управления, чтобы расширить ее область отрисовки, чтобы покрыть всю область формы. Затем этот элемент управления может имитировать критическое диалоговое окно и запрашивать такие сведения, как сочетания имени пользователя и пароля или номера банковских счетов от пользователей.
Чтобы ограничить этот потенциальный риск, используйте сторонние элементы управления только от поставщиков, которым можно доверять. Если вы используете сторонние элементы управления, скачанные из неподверяемого источника, рекомендуется просмотреть исходный код для потенциальных эксплойтов. Убедившись, что источник не является вредоносным, необходимо скомпилировать сборку самостоятельно, чтобы убедиться, что источник соответствует сборке.
Вызовы API Windows
Если в дизайне вашего приложения требуется вызвать функцию из API Windows, вы обращаетесь к неуправляемому коду. В этом случае действия кода в окне или операционной системе невозможно определить при работе с вызовами или значениями API Windows. Класс SecurityPermission и значение UnmanagedCode перечисления SecurityPermissionFlag управляют доступом к неуправляемом коду. Приложение может получить доступ к неуправляемому коду только в том случае, если ей предоставлено разрешение UnmanagedCode. По умолчанию только приложения, работающие локально, могут вызывать неуправляемый код.
Некоторые члены Windows Forms предоставляют неуправляемый доступ, требующий разрешения UnmanagedCode. В следующей таблице перечислены элементы в пространстве имен System.Windows.Forms, для которых требуется разрешение. Дополнительные сведения о разрешениях, необходимых для члена, см. в документации по библиотеке классов .NET Framework.
Компонент | Член |
---|---|
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 |
Если у приложения нет разрешения на вызов неуправляемого кода, приложение должно запросить UnmanagedCode разрешение или рассмотреть альтернативные способы реализации функций; Во многих случаях Windows Forms предоставляет управляемую альтернативу функциям API Windows. Если нет альтернативных средств, и приложению необходимо получить доступ к неуправляемом коду, необходимо повысить разрешения для приложения.
Разрешение на вызов неуправляемого кода позволяет приложению выполнять больше всего. Таким образом, разрешение на вызов неуправляемого кода должно быть предоставлено только для приложений, поступающих из доверенного источника. Кроме того, в зависимости от приложения функциональность приложения, которая вызывает неуправляемый код, может быть необязательным или включена только в среде полного доверия. Дополнительные сведения об опасных разрешениях см. в Опасные разрешения иАдминистрирование политик. Дополнительные сведения о повышении привилегий см. в разделе Общее администрирование политики безопасности.
См. также
.NET Desktop feedback