Безопасность частичного доверия в WPF
Как правило, интернет-приложениям следует ограничить прямой доступ к критическим системным ресурсам, чтобы избежать злонамеренного повреждения. По умолчанию HTML и языки сценариев на стороне клиента не могут получить доступ к критическим системным ресурсам. Поскольку Браузерные приложения Windows Presentation Foundation (WPF) может быть запущено из браузера, они должны соответствовать аналогичному набору ограничений. Для принудительного применения этих ограничений WPF полагается на CAS (Code Access Security — безопасность доступа кода) и ClickOnce (см. в разделе стратегия безопасности WPF — безопасность платформы). По умолчанию Браузерные приложения запрашивают зоны Интернета CAS набор разрешений, независимо от того, запускаются ли они из Интернета, локальной интрасети или локального компьютера. Приложения, выполняющиеся с набором разрешений меньшим, чем полный набор, называют выполняющимися с частичным доверием.
WPF предоставляет широкий спектр поддержки, чтобы убедиться, что число функциональных возможностей, как можно можно безопасно в режиме частичного доверия и вместе с CAS, обеспечивает дополнительную поддержку для программирования в режиме частичного доверия.
В этом разделе содержатся следующие подразделы.
Поддержка частичного доверия функциями WPF
В следующей таблице перечислены обобщенные функции Windows Presentation Foundation (WPF), которые являются безопасными для использования в пределах набора разрешений зоны Интернета.
Таблица 1. Функции WPF, являются безопасными в режиме частичного доверия
Область функции | Функция |
---|---|
Общие | Окно обозревателя Доступ к исходному сайту IsolatedStorage (ограничение 512 КБ) Поставщики UIAutomation Система команд Редакторы метода ввода (IME) Перо планшетного компьютера и рукописный ввод Моделирование перетаскивания с помощью событий захвата и перемещения мыши OpenFileDialog Десериализация XAML (посредством XamlReader.Load) |
Веб-интеграция | Диалоговое окно загрузки браузера Навигация верхнего уровня, инициированная пользователем mailto:links Параметры универсального идентификатора ресурса (URI) HTTPWebRequest Содержимое WPF, размещенное в IFRAME Размещение HTML-страниц одного веб-сайта с помощью Frame Размещение HTML-страниц одного веб-сайта с помощью WebBrowser Веб-службы (ASMX-файлы) Веб-службы (с помощью Windows Communication Foundation) Скрипты Модель DOM |
Визуальные элементы | 2D- и 3D-графика Анимация Мультимедиа (исходный сайт и междоменные) Обработка изображений/аудио/видео |
Чтение | FlowDocument XPS-документы Внедренные и системные шрифты Шрифты CFF и TrueType |
Редактирование | Проверка орфографии RichTextBox Поддержка буфера обмена для обычного текста и рукописного ввода Вставка, инициированная пользователем Копирование выделенного содержимого |
Элементы управления | Общие элементы управления |
Эта таблица охватывает WPF функции на высоком уровне. Более подробные сведения, Windows SDK задокументированы разрешения, необходимые каждому элементу в WPF. Кроме того, следующие функции содержат более подробные сведения, касающиеся выполнения при частичном доверии, включая некоторые особые аспекты.
XAML (см. в разделе Обзор XAML (WPF)).
Всплывающие окна (см. в разделе System.Windows.Controls.Primitives.Popup).
Перетаскивание (см. в разделе Drag and Drop Обзор).
Буфер обмена (см. в разделе System.Windows.Clipboard).
Работы с образами (см. в разделе System.Windows.Controls.Image).
Сериализация (см. в разделе XamlReader.Load, XamlWriter.Save).
Открыть файл-диалоговое окно (см. в разделе Microsoft.Win32.OpenFileDialog).
В следующей таблице описываются WPF набора разрешений зоны функции, которые не являются безопасными для выполнения в пределах Интернета.
Таблица 2. Функции WPF, не являются безопасными в режиме частичного доверия
Область функции | Функция |
---|---|
Общие | Окно (определенные приложением окна и диалоговые окна) SaveFileDialog Файловая система Доступ к реестру Перетаскивание Сериализация XAML (через XamlWriter.Save) Клиенты UIAutomation Доступ к исходному окну (HwndHost) Полная поддержка управления речью Взаимодействие с Windows Forms |
Визуальные элементы | Эффекты для точечных рисунков Кодирование изображений |
Редактирование | Буфер обмена формата RTF Полная поддержка XAML |
Программирование в режиме частичного доверия
Для XBAP приложения, код, превышающий набор разрешений по умолчанию, имеет другое поведение в зависимости от зоны безопасности. В некоторых случаях пользователь получит предупреждение при попытке установить приложение. Пользователь может выбрать продолжение или отмену установки. В следующей таблице описаны поведение приложения для каждой зоны безопасности и действия, необходимые для получения приложением полного доверия.
Зона безопасности | Поведение | Получение полного доверия |
---|---|---|
Локальный компьютер | Автоматическое получение полного доверия | Никаких действий не требуется. |
Интрасеть и надежные веб-сайты | Запрос полного доверия | Подпишите приложение XBAP с помощью сертификата, чтобы пользователь видел источник в запросе. |
Интернет | Сбой с сообщением "Доверие не оказано" | Подпишите приложение XBAP с помощью сертификата. |
Note
Поведение, описанное в предыдущей таблице, относится к приложениям XBAP с полным доверием, не следующим модели доверенного развертывания ClickOnce.
В общем случае код, который может превышать допустимые разрешения, вероятнее всего, является общим кодом, который совместно используется автономными и браузерными приложениями. CAS и WPF обеспечивают несколько методик для таких случаев.
Определение разрешений с помощью CAS
В некоторых случаях общий код в сборках библиотеки будет использоваться как автономными приложениями и XBAP. В этих случаях код может выполнять функции, которые могут потребовать больше разрешений, чем позволяет набор разрешений, присвоенный приложению. Приложение может определять, независимо от того, имеется ли он имеет определенное разрешение с помощью системы безопасности 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;
}
}
}
}
Если приложение не имеет нужных разрешений, вызов 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;
}
}
}
}
Во многих случаях вы сможете найти альтернативу частичному доверию.
В управляемой среде, например интрасети, можно установить пользовательские управляемых инфраструктур для всех клиентов в глобальном глобальный кэш сборок (GAC). Эти библиотеки могут выполнять код, который требует полного доверия и можно ссылаться из приложений, которым разрешено только частичное доверие, используя AllowPartiallyTrustedCallersAttribute (Дополнительные сведения см. в разделе безопасности и безопасность WPF Стратегия — безопасность платформы).
Обнаружение узла браузера
С помощью CAS для проверки разрешений является подходящим способом, когда необходимо проверить на основе отдельных разрешений. Тем не менее эта методика зависит от перехвата исключений в рамках нормальной обработки, что не рекомендуется в общем и может вызывать проблемы производительности. Вместо этого Если ваш Приложение обозревателя XAML (XBAP) выполняется только в песочнице зоны Интернета, можно использовать BrowserInteropHelper.IsBrowserHosted свойство, которое возвращает значение true для XAML-приложения браузера (XBAP).
Note
IsBrowserHosted только отличает ли приложение выполняется в браузере, не какой набор разрешений приложения, выполнив.
Управление разрешениями
По умолчанию XBAP с частичным доверием (набор разрешений зоны Интернета по умолчанию). Тем не менее в зависимости от требований приложения можно изменить набор разрешений по умолчанию. Например если XBAP запускается из локальной интрасети, он может воспользоваться преимуществом расширенного набора разрешений, как показано в следующей таблице.
Таблица 3. Разрешений LocalIntranet и Internet
Разрешение | Атрибут | LocalIntranet | Интернет |
---|---|---|---|
DNS | Доступ к DNS-серверам | Да | Нет |
Переменные среды | Чтение | Да | Нет |
Диалоговые окна для работы с файлами | Открыть | Да | Да |
Диалоговые окна для работы с файлами | Без ограничений | Да | Нет |
Изолированное хранилище | Изоляция сборки по пользователю | Да | Нет |
Изолированное хранилище | Неизвестная изоляция | Да | Да |
Изолированное хранилище | Неограниченная квота для пользователя | Да | Нет |
Мультимедиа | Безопасные аудио-, видеоданные и изображения | Да | Да |
Печать | Печать по умолчанию | Да | Нет |
Печать | Безопасная печать | Да | Да |
Отражение | Вывод | Да | Нет |
Безопасность | Выполнение управляемого кода | Да | Да |
Безопасность | Утверждение предоставленных разрешений | Да | Нет |
Пользовательский интерфейс | Без ограничений | Да | Нет |
Пользовательский интерфейс | Безопасные окна верхнего уровня | Да | Да |
Пользовательский интерфейс | Собственный буфер обмена | Да | Да |
Веб-браузер | Безопасная навигация по фреймам в HTML | Да | Да |
Note
Вырезание и вставка разрешены только в режиме частичного доверия при инициации пользователем.
Если вам требуется повысить уровень разрешений, необходимо изменить параметры проекта и манифест приложения ClickOnce. Дополнительные сведения см. в разделе Общие сведения о приложениях браузера WPF XAML. Следующие документы также могут быть полезны.
Если ваш XBAP требует полного доверия, можно использовать те же средства для предоставления запрошенных разрешений. Несмотря на то что XBAP только получит полное доверие, если он установлен на локальном компьютере и запущено с локального компьютера, интрасети или с URL-адрес, который указан в браузере доверенных или разрешенных сайтов. Если приложение установлено из интрасети или с доверенного сайта, пользователь получит стандартный запрос ClickOnce, уведомляющий о повышенных разрешениях. Пользователь может выбрать продолжение или отмену установки.
Кроме того, модель доверенного развертывания ClickOnce можно использовать для полностью доверенного развертывания из любой зоны безопасности. Дополнительные сведения см. в разделе Trusted Application Deployment Overview и безопасности.