Поделиться через


Безопасность частичного доверия WPF

Как правило, интернет-приложения должны быть ограничены доступом к критически важным системным ресурсам, чтобы предотвратить вредоносный ущерб. По умолчанию языки сценариев HTML и на стороне клиента не могут получить доступ к критически важным системным ресурсам. Так как размещенные в браузере приложения Windows Presentation Foundation (WPF) можно запустить из браузера, они должны соответствовать аналогичному набору ограничений. Для применения этих ограничений WPF основывается на безопасности доступа к коду (CAS) и ClickOnce (см. Стратегия безопасности WPF — Безопасность платформы). По умолчанию размещенные в браузере приложения запрашивают набор разрешений в зоне Интернета, независимо от того, запускаются ли они из Интернета, локальной интрасети или локального компьютера. Приложения, работающие с любым менее полным набором разрешений, как говорят, выполняются с частичным доверием.

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

В этом разделе содержатся следующие разделы:

Поддержка частичного доверия для возможностей 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. Кроме того, следующие возможности содержат более подробную информацию о выполнении частичного доверия, включая специальные соображения.

В следующей таблице описаны функции 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 для полного доверия при развертывании из любой зоны безопасности. Дополнительные сведения см. в Обзор развертывания доверенных приложений и Безопасность.

См. также