Zabezpieczenie częściowej relacji zaufania WPF

Ogólnie rzecz biorąc, aplikacje internetowe powinny być ograniczone przed bezpośrednim dostępem do krytycznych zasobów systemowych, aby zapobiec złośliwym uszkodzeniom. Domyślnie języki skryptów HTML i po stronie klienta nie mogą uzyskać dostępu do krytycznych zasobów systemowych. Ponieważ aplikacje hostowane w przeglądarce programu Windows Presentation Foundation (WPF) mogą być uruchamiane z przeglądarki, powinny one być zgodne z podobnym zestawem ograniczeń. Aby wymusić te ograniczenia, WPF opiera się zarówno na zabezpieczeniach dostępu kodu (CAS) i ClickOnce (zobacz WPF Security Strategy — Platform Security). Domyślnie aplikacje hostowane w przeglądarce żądają zestawu uprawnień CAS strefy internetowej, niezależnie od tego, czy są uruchamiane z Internetu, lokalnego intranetu, czy komputera lokalnego. Aplikacje, które działają z niczym mniejszym niż pełny zestaw uprawnień, są uruchamiane z częściowym zaufaniem.

Platforma WPF zapewnia szeroką gamę obsługi, aby zapewnić, że jak najwięcej funkcji można bezpiecznie używać w częściowym zaufaniu, a wraz z usługą CAS zapewnia dodatkową obsługę programowania częściowego zaufania.

Ten temat zawiera następujące sekcje:

Obsługa częściowego zaufania funkcji WPF

W poniższej tabeli wymieniono funkcje wysokiego poziomu programu Windows Presentation Foundation (WPF), które są bezpieczne do użycia w granicach zestawu uprawnień strefy internetowej.

Tabela 1. Funkcje WPF, które są Sejf w częściowym zaufaniu

Obszar funkcji Funkcja
Ogólne Okno przeglądarki

Witryna dostępu do źródła

IsolatedStorage (limit 512 KB)

Dostawcy interfejsu użytkownikaAutomation

Komendanta

Edytory Input Method Editor (IME)

Rysik tabletu i pisma odwłokowego

Symulowane przeciąganie/upuszczanie przy użyciu zdarzeń przechwytywania myszy i przenoszenia

Openfiledialog

Deserializacji XAML (za pośrednictwem XamlReader.Load)
Integracja z siecią Web Okno dialogowe pobierania przeglądarki

Nawigacja inicjowana przez użytkownika najwyższego poziomu

mailto:links

Parametry identyfikatora zasobów jednolitych

HTTPWebRequest

Zawartość WPF hostowana w elemecie IFRAME

Hostowanie stron HTML tej samej witryny przy użyciu ramki

Hostowanie stron HTML tej samej witryny przy użyciu aplikacji WebBrowser

Usługi sieci Web (ASMX)

Usługi sieci Web (przy użyciu programu Windows Communication Foundation)

Obsługa skryptów

Model obiektu dokumentu
Wizualizacje 2D i 3D

Animacja

Nośnik (lokacja pochodzenia i domena krzyżowa)

Obrazowanie/audio/wideo
Odczytywanie FlowDocuments

Dokumenty XPS

Osadzone i systemowe czcionki

Czcionki CFF i TrueType
Edytowanie Sprawdzanie pisowni

RichTextBox

Obsługa schowka w postaci zwykłego tekstu i pisma odk.

Wklej zainicjowane przez użytkownika

Kopiowanie wybranej zawartości
Kontrolki Kontrolki ogólne

W tej tabeli omówiono funkcje WPF na wysokim poziomie. Aby uzyskać bardziej szczegółowe informacje, zestaw SDK systemu Windows dokumentuje uprawnienia wymagane przez każdego członka w WPF. Ponadto poniższe funkcje zawierają bardziej szczegółowe informacje dotyczące częściowego wykonywania zaufania, w tym specjalne zagadnienia.

W poniższej tabeli przedstawiono funkcje WPF, które nie są bezpieczne do uruchomienia w granicach zestawu uprawnień strefy internetowej.

Tabela 2. Funkcje WPF, które nie są Sejf w częściowej relacji zaufania

Obszar funkcji Funkcja
Ogólne Okno (okna zdefiniowane przez aplikację i okna dialogowe)

Savefiledialog

System plików

Dostęp do rejestru

Przeciągnij i opuść

Serializacja XAML (za pośrednictwem XamlWriter.Save)

Klienci interfejsu użytkownikaAutomation

Dostęp do okna źródłowego (HwndHost)

Obsługa pełnej mowy

Współdziałanie formularzy systemu Windows
Wizualizacje Efekty mapy bitowej

Kodowanie obrazów
Edytowanie Schowek formatu tekstu sformatowanego

Pełna obsługa języka XAML

Częściowe programowanie zaufania

W przypadku aplikacji XBAP kod przekraczający domyślny zestaw uprawnień będzie miał inne zachowanie w zależności od strefy zabezpieczeń. W niektórych przypadkach użytkownik otrzyma ostrzeżenie podczas próby jego zainstalowania. Użytkownik może kontynuować lub anulować instalację. W poniższej tabeli opisano zachowanie aplikacji dla każdej strefy zabezpieczeń oraz czynności, które należy wykonać, aby aplikacja otrzymała pełne zaufanie.

Ostrzeżenie

XBAPs wymagają obsługi starszych przeglądarek, takich jak Internet Explorer i Firefox. Te starsze wersje przeglądarki są zwykle nieobsługiwane w systemach Windows 10 i Windows 11. Nowoczesne przeglądarki nie obsługują już technologii wymaganej dla aplikacji XBAP ze względu na zagrożenia bezpieczeństwa. Wtyczki obsługujące XBAPs nie są już obsługiwane.

Strefa zabezpieczeń Zachowanie Uzyskiwanie pełnego zaufania
Komputer lokalny Automatyczne pełne zaufanie Nie trzeba wykonywać żadnych czynności.
Intranet i zaufane witryny Monituj o pełne zaufanie Podpisz plik XBAP przy użyciu certyfikatu, aby użytkownik widział źródło w wierszu polecenia.
Internet Kończy się niepowodzeniem z komunikatem "Zaufanie nie udzielono" Podpisz XBAP przy użyciu certyfikatu.

Uwaga

Zachowanie opisane w poprzedniej tabeli dotyczy pełnego zaufania XBAPs, które nie są zgodne z modelem zaufanego wdrażania ClickOnce.

Ogólnie rzecz biorąc, kod, który może przekroczyć dozwolone uprawnienia, może być typowym kodem, który jest współużytkowany zarówno między aplikacjami autonomicznymi, jak i hostowanymi w przeglądarce. Cas i WPF oferują kilka technik zarządzania tym scenariuszem.

Wykrywanie uprawnień przy użyciu usługi CAS

W niektórych sytuacjach można używać kodu współużytkowanego w zestawach biblioteki zarówno przez aplikacje autonomiczne, jak i XBAPs. W takich przypadkach kod może wykonywać funkcje, które mogą wymagać większej liczby uprawnień niż dozwolony zestaw uprawnień przyznanych przez aplikację. Aplikacja może wykryć, czy ma określone uprawnienia przy użyciu zabezpieczeń programu Microsoft .NET Framework. W szczególności może sprawdzić, czy ma określone uprawnienie, wywołując Demand metodę w wystąpieniu żądanego uprawnienia. Jest to pokazane w poniższym przykładzie, który zawiera kod, który wykonuje zapytania dotyczące tego, czy ma możliwość zapisania pliku na dysku lokalnym:

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

Jeśli aplikacja nie ma odpowiednich uprawnień, wywołanie Demand metody zgłasza wyjątek zabezpieczeń. W przeciwnym razie udzielono uprawnień. IsPermissionGranted Hermetyzuje to zachowanie i zwraca true lub false zgodnie z potrzebami.

Łaskawa degradacja funkcjonalności

Możliwość wykrywania, czy kod ma uprawnienia do wykonywania tego, co musi zrobić, jest interesujący dla kodu, który można wykonać z różnych stref. Podczas wykrywania strefy jest jedną rzeczą, znacznie lepiej jest zapewnić alternatywę dla użytkownika, jeśli to możliwe. Na przykład aplikacja o pełnym zaufaniu zwykle umożliwia użytkownikom tworzenie plików w dowolnym miejscu, a aplikacja częściowo zaufania może tworzyć tylko pliki w izolowanym magazynie. Jeśli kod do utworzenia pliku istnieje w zestawie, który jest współużytkowany przez zarówno aplikacje pełne zaufania (autonomiczne) jak i aplikacje częściowo zaufania (hostowane w przeglądarce), a obie aplikacje chcą, aby użytkownicy mogli tworzyć pliki, kod udostępniony powinien wykryć, czy działa w częściowej lub pełnej relacji zaufania przed utworzeniem pliku w odpowiedniej lokalizacji. Poniższy kod demonstruje oba te elementy.

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

W wielu przypadkach powinno być możliwe znalezienie częściowej alternatywy zaufania.

W kontrolowanym środowisku, takim jak intranet, niestandardowe struktury zarządzane można zainstalować w całej bazie klienta w globalnej pamięci podręcznej zestawów (GAC). Te biblioteki mogą wykonywać kod, który wymaga pełnego zaufania i odwoływać się do aplikacji, które są dozwolone tylko częściowe zaufanie przy użyciu AllowPartiallyTrustedCallersAttribute (aby uzyskać więcej informacji, zobacz Security and WPF Security Strategy - Platform Security).

Wykrywanie hosta przeglądarki

Sprawdzanie uprawnień przy użyciu usługi CAS jest odpowiednią techniką, jeśli musisz sprawdzić na podstawie poszczególnych uprawnień. Mimo że ta technika zależy od przechwytywania wyjątków w ramach normalnego przetwarzania, co nie jest ogólnie zalecane i może mieć problemy z wydajnością. Zamiast tego, jeśli aplikacja przeglądarki XAML (XBAP) działa tylko w piaskownicy strefy internetowej, możesz użyć BrowserInteropHelper.IsBrowserHosted właściwości , która zwraca wartość true dla aplikacji przeglądarki XAML (XBAPs).

Ostrzeżenie

XBAPs wymagają obsługi starszych przeglądarek, takich jak Internet Explorer i Firefox. Te starsze wersje przeglądarki są zwykle nieobsługiwane w systemach Windows 10 i Windows 11. Nowoczesne przeglądarki nie obsługują już technologii wymaganej dla aplikacji XBAP ze względu na zagrożenia bezpieczeństwa. Wtyczki obsługujące XBAPs nie są już obsługiwane.

Uwaga

IsBrowserHosted Rozróżnia tylko, czy aplikacja jest uruchomiona w przeglądarce, a nie w którym zestawie uprawnień jest uruchomiona aplikacja.

Zarządzanie uprawnieniami

Domyślnie XBAPs są uruchamiane z częściowym zaufaniem (domyślny zestaw uprawnień strefy internetowej). Jednak w zależności od wymagań aplikacji można zmienić zestaw uprawnień z domyślnego. Jeśli na przykład kod XBAPs jest uruchamiany z lokalnego intranetu, może skorzystać ze zwiększonego zestawu uprawnień, który przedstawiono w poniższej tabeli.

Ostrzeżenie

XBAPs wymagają obsługi starszych przeglądarek, takich jak Internet Explorer i Firefox. Te starsze wersje przeglądarki są zwykle nieobsługiwane w systemach Windows 10 i Windows 11. Nowoczesne przeglądarki nie obsługują już technologii wymaganej dla aplikacji XBAP ze względu na zagrożenia bezpieczeństwa. Wtyczki obsługujące XBAPs nie są już obsługiwane.

Tabela 3. Uprawnienia lokalneIntranet i Internet

Uprawnienie Atrybut Localintranet Internet
DNS Uzyskiwanie dostępu do serwerów DNS Tak Nie.
Zmienne środowiskowe Przeczytaj Tak Nie.
Okna dialogowe plików Otwarcie Tak Tak
Okna dialogowe plików Bez ograniczeń Tak Nie.
Izolowany magazyn Izolacja zestawu według użytkownika Tak Nie.
Izolowany magazyn Nieznana izolacja Tak Tak
Izolowany magazyn Nieograniczony limit przydziału użytkowników Tak Nie.
Multimedia Sejf audio, wideo i obrazy Tak Tak
Drukowanie Drukowanie domyślne Tak Nie.
Drukowanie drukowanie Sejf Tak Tak
Odbicie Emitować Tak Nie
Zabezpieczenia Wykonywanie kodu zarządzanego Tak Tak
Zabezpieczenia Potwierdzanie udzielonych uprawnień Tak Nie.
Interfejs użytkownika Bez ograniczeń Tak Nie.
Interfejs użytkownika okna najwyższego poziomu Sejf Tak Tak
Interfejs użytkownika Własny schowek Tak Tak
Przeglądarka internetowa nawigacja Sejf ramką do kodu HTML Tak Tak

Uwaga

Wycinanie i wklejanie jest dozwolone tylko w przypadku częściowego zaufania po zainicjowaniu przez użytkownika.

Jeśli musisz zwiększyć uprawnienia, musisz zmienić ustawienia projektu i manifest aplikacji ClickOnce. Aby uzyskać więcej informacji, zobacz WPF XAML Browser Applications Overview (Omówienie aplikacji przeglądarki WPF XAML). Poniższe dokumenty mogą być również przydatne.

Jeśli XBAP wymaga pełnego zaufania, możesz użyć tych samych narzędzi, aby zwiększyć żądane uprawnienia. Mimo że XBAP otrzyma pełne zaufanie tylko w przypadku instalacji i uruchomienia z komputera lokalnego, intranetu lub adresu URL wymienionego w zaufanych lub dozwolonych witrynach przeglądarki. Jeśli aplikacja jest zainstalowana z intranetu lub zaufanej witryny, użytkownik otrzyma standardowy monit ClickOnce z powiadomieniem o podwyższonym poziomie uprawnień. Użytkownik może kontynuować lub anulować instalację.

Alternatywnie możesz użyć modelu zaufanego wdrażania ClickOnce do pełnego wdrożenia zaufania z dowolnej strefy zabezpieczeń. Aby uzyskać więcej informacji, zobacz Omówienie i zabezpieczenia zaufanych wdrożeń aplikacji.

Zobacz też