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ą bezpieczne 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.
XAML (zobacz XAML w WPF).
Wyskakujące okienka (zobacz System.Windows.Controls.Primitives.Popup).
Przeciągnij i upuść (zobacz Omówienie przeciągania i upuszczania).
Schowek (zobacz System.Windows.Clipboard).
Obrazowanie (zobacz System.Windows.Controls.Image).
Serializacja (zobacz XamlReader.Load, XamlWriter.Save).
Otwórz okno dialogowe Plik (zobacz Microsoft.Win32.OpenFileDialog).
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ą bezpieczne w częściowym zaufaniu
Obszar funkcji | Funkcja |
---|---|
Ogólne | Okno (okna zdefiniowane przez aplikację i okna dialogowe) Zapisz plikDialog 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 stare wersje przeglądarki Firefox. Te starsze 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. Aby uzyskać więcej informacji, zobacz Często zadawane pytania dotyczące aplikacji hostowanych w przeglądarce WPF (XBAP).
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 stare wersje przeglądarki Firefox. Te starsze 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. Aby uzyskać więcej informacji, zobacz Często zadawane pytania dotyczące aplikacji hostowanych w przeglądarce WPF (XBAP).
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 stare wersje przeglądarki Firefox. Te starsze 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. Aby uzyskać więcej informacji, zobacz Często zadawane pytania dotyczące aplikacji hostowanych w przeglądarce WPF (XBAP).
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 | Bezpieczny dźwięk, wideo i obrazy | Tak | Tak |
Drukowanie | Drukowanie domyślne | Tak | Nie. |
Drukowanie | Bezpieczne drukowanie | 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 | Bezpieczne okna najwyższego poziomu | Tak | Tak |
Interfejs użytkownika | Własny schowek | Tak | Tak |
Przeglądarka internetowa | Bezpieczna nawigacja 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.
MageUI.exe (Narzędzie tworzenia i edycji manifestów, klient graficzny).
Zabezpieczanie aplikacji ClickOnce.
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ż
.NET Desktop feedback