Безопасность частичного доверия WPF
Как правило, интернет-приложения должны быть ограничены доступом к критически важным системным ресурсам, чтобы предотвратить вредоносный ущерб. По умолчанию языки сценариев HTML и на стороне клиента не могут получить доступ к критически важным системным ресурсам. Так как размещенные в браузере приложения Windows Presentation Foundation (WPF) можно запустить из браузера, они должны соответствовать аналогичному набору ограничений. Для применения этих ограничений WPF основывается на безопасности доступа к коду (CAS) и ClickOnce (см. Стратегия безопасности WPF — Безопасность платформы). По умолчанию размещенные в браузере приложения запрашивают набор разрешений в зоне Интернета, независимо от того, запускаются ли они из Интернета, локальной интрасети или локального компьютера. Приложения, работающие с любым менее полным набором разрешений, как говорят, выполняются с частичным доверием.
WPF предоставляет широкий спектр поддержки, чтобы обеспечить безопасное использование максимальной функциональности в частичном доверии и наряду с CAS обеспечивает дополнительную поддержку программирования частичного доверия.
В этом разделе содержатся следующие разделы:
поддержки частичного доверия
функций WPF
Поддержка частичного доверия для возможностей WPF
В следующей таблице перечислены высокоуровневые функции Windows Presentation Foundation (WPF), которые безопасно используются в пределах набора разрешений зоны Интернета.
Таблица 1. Функции WPF, безопасные в частичном доверии
Область функционала | Особенность |
---|---|
Общее | Окно браузера Доступ к сайту происхождения IsolatedStorage (ограничение в 512 КБ) Поставщики UIAutomation Властный Редакторы методов ввода (IMEs) Стилус для планшета и цифровые чернила Имитация перетаскивания с использованием событий захвата и перемещения мыши OpenFileDialog Десериализация XAML (через XamlReader.Load) |
Веб-интеграция | Диалоговое окно загрузки браузера навигация Top-Level User-Initiated mailto:links Параметры универсального идентификатора ресурса HTTPWebRequest Содержимое WPF, размещенное в IFRAME Размещение Same-Site HTML-страниц с помощью фрейма Размещение HTML-страниц того же сайта с помощью WebBrowser Веб-службы (ASMX) Веб-службы (с помощью Windows Communication Foundation) Сценарии Объектная модель документа |
Визуальные эффекты | 2D и 3D Мультипликация Медиа (сайт происхождения и междоменное взаимодействие) Визуализация, звук и видео |
Чтение | FlowDocuments Документы XPS Внедренные & системные шрифты Шрифты CFF & TrueType |
Редактирование | Проверка орфографии Поле форматированного текста Поддержка буфера обмена для "Обычного текста" и "Рукописного текста" User-Initiated вставка Копирование выбранного содержимого |
Рычаги управления | Общие элементы управления |
В этой таблице рассматриваются функции WPF на высоком уровне. Для получения более подробной информации документы Windows SDK описывают разрешения, требуемые для каждого элемента в WPF. Кроме того, следующие возможности содержат более подробную информацию о выполнении частичного доверия, включая специальные соображения.
XAML (см. XAML в WPF).
Всплывающие окна (см. System.Windows.Controls.Primitives.Popup).
Буфер обмена (см. System.Windows.Clipboard).
Изображение (см. System.Windows.Controls.Image).
Сериализация (см. XamlReader.Load, XamlWriter.Save).
Диалоговое окно "Открыть файл" (см. Microsoft.Win32.OpenFileDialog).
В следующей таблице описаны функции WPF, которые небезопасны для выполнения в пределах набора разрешений зоны Интернета.
Таблица 2. Функции WPF, небезопасные в частичном доверии
Область функций | Особенность |
---|---|
Общее | Окно (определяемые приложением окна и диалоговые окна) Диалог сохранения файла Файловая система Доступ к реестру Перетаскивание Сериализация XAML (с помощью XamlWriter.Save) Клиенты UIAutomation Доступ к окну источника (HwndHost) Полная поддержка речи Взаимодействие с Windows Forms |
Визуальные эффекты | Эффекты растрового изображения Кодировка изображений |
Редактирование | Буфер обмена в формате RTF Полная поддержка XAML |
Программирование частичного доверия
Для приложений XBAP код, превышающий набор разрешений по умолчанию, будет иметь другое поведение в зависимости от зоны безопасности. В некоторых случаях пользователь получит предупреждение при попытке установить его. Пользователь может продолжить или отменить установку. В следующей таблице описывается поведение приложения для каждой зоны безопасности и то, что необходимо сделать для приложения для получения полного доверия.
Предупреждение
Для работы XBAPs требуются устаревшие браузеры, такие как Internet Explorer и старые версии Firefox. Эти старые браузеры обычно не поддерживаются в Windows 10 и Windows 11. Современные браузеры больше не поддерживают технологию, необходимую для приложений XBAP из-за рисков безопасности. Модули для XBAP больше не поддерживаются. Дополнительные сведения см. в статье Часто задаваемые вопросы о приложениях, размещенных в браузере WPF (XBAP),.
Зона безопасности | Поведение | Получение полного доверия |
---|---|---|
Локальный компьютер | Автоматическое полное доверие | Никаких действий не требуется. |
Интрасети и доверенные сайты | Запрос на полное доверие | Подпишите XBAP сертификатом, чтобы пользователь видел источник в запросе. |
Интернет | Сбой с параметром "Доверие не предоставлено" | Подпишите XBAP с помощью сертификата. |
Заметка
Поведение, описанное в предыдущей таблице, имеется для XBAP с полным уровнем доверия, которые не соответствуют модели надежного развертывания ClickOnce.
Как правило, код, который может превышать разрешенные разрешения, скорее всего, будет общим кодом, общим для обоих автономных и размещенных в браузере приложений. CAS и WPF предлагают несколько методов для управления этим сценарием.
Обнаружение разрешений с помощью CAS
В некоторых ситуациях общий код в сборках библиотеки можно использовать как автономными приложениями, так и XBAPs. В таких случаях код может выполнять функциональные возможности, которые могут требовать больше разрешений, чем разрешенный набор разрешений приложения. Приложение может определить, имеет ли оно определенное разрешение с помощью безопасности Microsoft .NET Framework. В частности, он может проверить, имеет ли он определенное разрешение, вызвав метод Demand на экземпляре желаемого разрешения. Это показано в следующем примере, который содержит код, который запрашивает возможность сохранения файла на локальный диск:
using System.IO;
using System.IO.IsolatedStorage;
using System.Security;
using System.Security.Permissions;
using System.Windows;
namespace SDKSample
{
public class FileHandling
{
public void Save()
{
if (IsPermissionGranted(new FileIOPermission(FileIOPermissionAccess.Write, @"c:\newfile.txt")))
{
// Write to local disk
using (FileStream stream = File.Create(@"c:\newfile.txt"))
using (StreamWriter writer = new StreamWriter(stream))
{
writer.WriteLine("I can write to local disk.");
}
}
else
{
MessageBox.Show("I can't write to local disk.");
}
}
// Detect whether or not this application has the requested permission
bool IsPermissionGranted(CodeAccessPermission requestedPermission)
{
try
{
// Try and get this permission
requestedPermission.Demand();
return true;
}
catch
{
return false;
}
}
Imports System.IO
Imports System.IO.IsolatedStorage
Imports System.Security
Imports System.Security.Permissions
Imports System.Windows
Namespace SDKSample
Public Class FileHandling
Public Sub Save()
If IsPermissionGranted(New FileIOPermission(FileIOPermissionAccess.Write, "c:\newfile.txt")) Then
' Write to local disk
Using stream As FileStream = File.Create("c:\newfile.txt")
Using writer As New StreamWriter(stream)
writer.WriteLine("I can write to local disk.")
End Using
End Using
Else
MessageBox.Show("I can't write to local disk.")
End If
End Sub
' Detect whether or not this application has the requested permission
Private Function IsPermissionGranted(ByVal requestedPermission As CodeAccessPermission) As Boolean
Try
' Try and get this permission
requestedPermission.Demand()
Return True
Catch
Return False
End Try
End Function
}
}
End Class
End Namespace
Если у приложения нет требуемого разрешения, вызов Demand вызовет исключение безопасности. В противном случае разрешение было предоставлено.
IsPermissionGranted
инкапсулирует это поведение и возвращает true
или false
соответствующим образом.
Плавное снижение функциональности
Возможность определить, имеет ли код разрешение на выполнение необходимых действий, интересно для кода, который может выполняться из разных зон. Хотя обнаружение зоны само по себе важно, гораздо лучше, если возможно, предоставить пользователю альтернативу. Например, приложение полного доверия обычно позволяет пользователям создавать файлы в любом месте, в то время как приложение с частичным доверием может создавать файлы только в изолированном хранилище. Если код для создания файла существует в сборке, которая предоставляется как приложениям полного доверия (автономным) приложениям, так и приложениям с частичным доверием (размещенным в браузере), и оба приложения хотят, чтобы пользователи могли создавать файлы, общий код должен определить, работает ли он в частичном или полном доверии перед созданием файла в соответствующем расположении. В следующем коде показано оба.
using System.IO;
using System.IO.IsolatedStorage;
using System.Security;
using System.Security.Permissions;
using System.Windows;
namespace SDKSample
{
public class FileHandlingGraceful
{
public void Save()
{
if (IsPermissionGranted(new FileIOPermission(FileIOPermissionAccess.Write, @"c:\newfile.txt")))
{
// Write to local disk
using (FileStream stream = File.Create(@"c:\newfile.txt"))
using (StreamWriter writer = new StreamWriter(stream))
{
writer.WriteLine("I can write to local disk.");
}
}
else
{
// Persist application-scope property to
// isolated storage
IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();
using (IsolatedStorageFileStream stream =
new IsolatedStorageFileStream("newfile.txt", FileMode.Create, storage))
using (StreamWriter writer = new StreamWriter(stream))
{
writer.WriteLine("I can write to Isolated Storage");
}
}
}
// Detect whether or not this application has the requested permission
bool IsPermissionGranted(CodeAccessPermission requestedPermission)
{
try
{
// Try and get this permission
requestedPermission.Demand();
return true;
}
catch
{
return false;
}
}
Imports System.IO
Imports System.IO.IsolatedStorage
Imports System.Security
Imports System.Security.Permissions
Imports System.Windows
Namespace SDKSample
Public Class FileHandlingGraceful
Public Sub Save()
If IsPermissionGranted(New FileIOPermission(FileIOPermissionAccess.Write, "c:\newfile.txt")) Then
' Write to local disk
Using stream As FileStream = File.Create("c:\newfile.txt")
Using writer As New StreamWriter(stream)
writer.WriteLine("I can write to local disk.")
End Using
End Using
Else
' Persist application-scope property to
' isolated storage
Dim storage As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication()
Using stream As New IsolatedStorageFileStream("newfile.txt", FileMode.Create, storage)
Using writer As New StreamWriter(stream)
writer.WriteLine("I can write to Isolated Storage")
End Using
End Using
End If
End Sub
' Detect whether or not this application has the requested permission
Private Function IsPermissionGranted(ByVal requestedPermission As CodeAccessPermission) As Boolean
Try
' Try and get this permission
requestedPermission.Demand()
Return True
Catch
Return False
End Try
End Function
}
}
End Class
End Namespace
Во многих случаях вы сможете найти альтернативу частичного доверия.
В контролируемой среде, например, в интрасети, пользовательские управляемые фреймворки можно установить по клиентской базе в глобальный кэш сборок (GAC). Эти библиотеки могут выполнять код, требующий полного доверия, и ссылаться на них из приложений, которым разрешено только частичное доверие с помощью AllowPartiallyTrustedCallersAttribute (дополнительные сведения см. в разделе Безопасность и стратегии безопасности WPF — платформа безопасности).
Обнаружение хоста браузера
Использование CAS для проверки разрешений является подходящим способом, когда необходимо проверять каждое отдельное разрешение. Хотя этот метод зависит от перехвата исключений в рамках обычной обработки, которая не рекомендуется в целом и может иметь проблемы с производительностью. Вместо этого, если приложение браузера XAML (XBAP) выполняется только в песочнице зоны Интернета, можно использовать свойство BrowserInteropHelper.IsBrowserHosted, которое возвращает значение true для приложений браузера XAML (XBAPs).
Предупреждение
Для работы XBAPs требуются устаревшие браузеры, такие как Internet Explorer и старые версии Firefox. Эти старые браузеры обычно не поддерживаются в Windows 10 и Windows 11. Современные браузеры больше не поддерживают технологию, необходимую для приложений XBAP из-за рисков безопасности. Плагины, поддерживающие XBAP, больше не функционируют. Дополнительные сведения см. в статье Часто задаваемые вопросы о приложениях, размещенных в браузере WPF (XBAP),.
Заметка
IsBrowserHosted только определяет, работает ли приложение в браузере, а не набор разрешений, с которым работает приложение.
Управление разрешениями
По умолчанию XBAPs запускаются с частичным доверием (используется набор разрешений зоны Интернета по умолчанию). Однако в зависимости от требований приложения можно изменить набор разрешений по умолчанию. Например, если XBAPs запускается из локальной интрасети, он может воспользоваться расширенным набором разрешений, который показан в следующей таблице.
Предупреждение
Для работы XBAPs требуются устаревшие браузеры, такие как Internet Explorer и старые версии Firefox. Эти старые браузеры обычно не поддерживаются в Windows 10 и Windows 11. Современные браузеры больше не поддерживают технологию, необходимую для приложений XBAP из-за рисков безопасности. Поддержка плагинов, обеспечивающих работу XBAP, прекращена. Дополнительные сведения см. в статье Часто задаваемые вопросы о приложениях, размещенных в браузере WPF (XBAP),.
Таблица 3. Разрешения LocalIntranet и Интернет
Разрешение | Атрибут | LocalIntranet | Интернет |
---|---|---|---|
DNS | Доступ к DNS-серверам | Да | Нет |
Переменные среды | Читать | Да | Нет |
Диалоговые окна файлов | Открыть | Да | Да |
Диалоговые окна файлов | Неограниченный | Да | Нет |
Изолированное хранилище | Изоляция сборок пользователем | Да | Нет |
Изолированное хранилище | Неизвестная изоляция | Да | Да |
Изолированное хранилище | Неограниченная квота пользователя | Да | Нет |
Медиа | Безопасный звук, видео и изображения | Да | Да |
Печатание | Печать по умолчанию | Да | Нет |
Печатание | Безопасная печать | Да | Да |
Отражение | Испускать | Да | Нет |
Безопасность | Выполнение управляемого кода | Да | Да |
Безопасность | Подтвердить предоставленные разрешения | Да | Нет |
Пользовательский интерфейс | Неограниченный | Да | Нет |
Пользовательский интерфейс | Безопасные окна верхнего уровня | Да | Да |
Пользовательский интерфейс | Собственный буфер обмена | Да | Да |
Веб-обозреватель | Безопасная навигация по фреймам в HTML-документе | Да | Да |
Заметка
Вырезание и вставка разрешены только в частичном доверии, когда это инициировано пользователем.
Если необходимо увеличить разрешения, необходимо изменить параметры проекта и манифест приложения ClickOnce. Для получения дополнительных сведений см. обзор приложений браузера WPF XAML. Следующие документы также могут оказаться полезными.
Если для XBAP требуется полное доверие, можно использовать те же средства для увеличения запрошенных разрешений. Хотя XBAP будет получать полное доверие только в том случае, если он установлен и запущен с локального компьютера, интрасети или из URL-адреса, указанного в доверенных или разрешенных сайтах браузера. Если приложение установлено из интрасети или доверенного сайта, пользователь получит стандартный запрос ClickOnce, уведомляющий их о повышенных разрешениях. Пользователь может продолжить или отменить установку.
Кроме того, можно использовать модель доверенного развертывания ClickOnce для полного доверия при развертывании из любой зоны безопасности. Дополнительные сведения см. в Обзор развертывания доверенных приложений и Безопасность.
См. также
- Безопасность
- Стратегия безопасности WPF - безопасность платформы
- стратегия безопасности WPF — проектирование безопасности
.NET Desktop feedback