Дополнительные вопросы безопасности в формах Windows Forms

Определенные параметры безопасности .NET Framework могут привести к тому, что ваше приложение будет выполняться по-разному в среде с частичным доверием и на локальном компьютере. .NET Framework ограничивает доступ, помимо прочего, к таким важнейшим локальным ресурсам, как файловая система, сеть и неуправляемые API. Параметры безопасности влияют на возможность вызова интерфейса API Microsoft Windows или других интерфейсов API, которые не могут быть проверены системой безопасности. Безопасность также влияет на другие аспекты приложения, включая доступ к файлам и данным, и вывод на печать. Дополнительные сведения о доступе к файлам и данным в среде с частичным доверием см. в разделе Более безопасный доступ к файлам и данным в Windows Forms. Дополнительные сведения о выводе на печать в среде с частичным доверием см. в разделе Более безопасная печать в Windows Forms.

В следующих разделах описывается работа с буфером обмена, управление окнами и вызов API Windows из приложений, работающих в среде с частичным доверием.

Доступ к буферу обмена

Класс UIPermission управляет доступом к буферу обмена, а связанное с ним значение перечисления UIPermissionClipboard указывает на уровень доступа. В следующей таблице приведены возможные уровни разрешения.

Значение UIPermissionClipboard Description
AllClipboard Буфер обмена можно использовать без ограничений.
OwnClipboard Буфер обмена можно использовать с некоторыми ограничениями. Возможность размещения данных в буфере обмена (операции с командами копирования и вырезания) не ограничена. Встроенные элементы управления, которые принимают операцию вставки, например текстовое поле, могут принимать данные из буфера обмена, но пользовательские элементы управления не могут программно считывать данные из буфера обмена.
NoClipboard Буфер обмена использовать нельзя.

По умолчанию зона локальной интрасети получает доступ к AllClipboard, а зона Интернета — к OwnClipboard. Это означает, что приложение может копировать данные в буфер обмена, но не может программно вставлять или считывать данные из буфера обмена. Благодаря таким ограничениям программы, не имеющие полного доверия, не могут считывать содержимое из буфера обмена, скопированное другим приложением. Если приложению требуется полный доступ к буферу обмена, но у вас нет соответствующих разрешений, для приложения необходимо повысить уровень разрешений. Дополнительные сведения о повышении уровня разрешений см. в разделе Общее администрирование политик безопасности.

Управление окнами

Класс UIPermission также управляет разрешением на выполнение операций с окнами и другими интерфейсами, а связанное с ним значение перечисления UIPermissionWindow указывает уровень доступа. В следующей таблице приведены возможные уровни разрешения.

По умолчанию зона локальной интрасети получает доступ к AllWindows, а зона Интернета — к SafeTopLevelWindows. Это означает, что в зоне Интернета приложение может выполнять большинство операций с окнами и пользовательским интерфейсом, но внешний вид окна будет изменяться. В измененном окне при первом запуске отображается всплывающее уведомление. В таком окне также изменен заголовок, а в строке заголовка должна быть кнопка "Закрыть". Всплывающее уведомление и строка заголовка информируют пользователя приложения о том, что данное приложение выполняется в режиме частичного доверия.

Значение UIPermissionWindow Description
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, то вами осуществляется доступ к неуправляемому коду. В этом случае при работе с вызовами Windows API или значениями выполняемые действия кода с окном или операционной системой определить невозможно. Класс 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. Если альтернативного способа нет, а приложению необходимо получать доступ к неуправляемому коду, повысьте уровень разрешений для такого приложения.

Благодаря разрешению на вызов неуправляемого кода приложение может выполнять практически любые действия. Следовательно, разрешение на вызов неуправляемого кода должно предоставляться только приложениям из доверенного источника. Кроме того, в зависимости от приложения, часть функциональных возможностей приложения, вызывающих неуправляемый код, может быть необязательной или использоваться только в среде с полным доверием. Дополнительные сведения об опасных разрешениях см. в разделе Опасные разрешения и администрирование политик. Дополнительные сведения о повышении уровня разрешений см. в разделе Общее администрирование политик безопасности.

См. также