WPF-Sicherheit mit teilweiser Vertrauenswürdigkeit
Im Allgemeinen sollte der direkte Zugriff von Internetanwendungen auf wichtige Systemressourcen eingeschränkt werden, um böswillige Schäden zu vermeiden. Standardmäßig können HTML und clientseitige Skriptsprachen nicht auf wichtige Systemressourcen zugreifen. Da in einem Browser gehostete Windows Presentation Foundation WPF-Anwendungen aus dem Browser gestartet werden können, sollten für sie ähnliche Beschränkungen gelten. Um diese Beschränkungen durchzusetzen, verwendet WPF sowohl Code Access Security (CAS) als auch ClickOnce (weitere Informationen finden Sie unter WPF-Sicherheitsstrategie – Plattformsicherheit). Standardmäßig fordern im Browser gehostete Anwendungen den CAS-Berechtigungssatz für die Internetzone an, und zwar unabhängig davon, ob sie aus dem Internet, aus dem lokalen Intranet oder vom lokalen Computer gestartet wurden. Für Anwendungen, die nicht mit dem vollständigen, sondern einem eingeschränkten Berechtigungssatz ausgeführt werden, wird formuliert, dass sie mit teilweiser Vertrauenswürdigkeit ausgeführt werden.
WPF bietet viele Arten der Unterstützung, um sicherzustellen, dass bei teilweiser Vertrauenswürdigkeit möglichst viel Funktionalität sicher ausgeführt werden kann, und bietet zusammen mit CAS zusätzliche Unterstützung für die Programmierung mit teilweiser Vertrauenswürdigkeit.
Dieses Thema enthält folgende Abschnitte:
WPF-Funktionen für die Unterstützung von teilweiser Vertrauenswürdigkeit
Die folgende Tabelle enthält die allgemeinen Funktionen von Windows Presentation Foundation WPF, die in den Grenzen des Berechtigungssatzes für die Internetzone bedenkenlos verwendet werden können.
Tabelle 1: WPF-Funktionen, die bei teilweiser Vertrauenswürdigkeit sicher sind
Featurebereich | Funktion |
---|---|
Allgemein | Browserfenster Zugriff auf Ursprungswebsite IsolatedStorage (beschränkt auf 512 KB) UIAutomation-Anbieter Befehle Eingabemethoden-Editoren (Input Method Editors, IMEs) Tablettstift und Freihandeingaben Simuliertes Drag & Drop mit Ereignissen für Mausaufzeichnung und Bewegen OpenFileDialog XAML-Deserialisierung (über XamlReader.Load) |
Webintegration | Download-Dialogfeld des Browsers Vom Benutzer initiierte Navigation auf oberster Ebene mailto:links Uniform Resource Identifier-Parameter HTTPWebRequest In einem IFRAME gehosteter WPF-Inhalt Hosten von HTML-Seiten aus derselben Website mithilfe eines Frames Hosten von HTML-Seiten aus derselben Website mithilfe von WebBrowser Webdienste (ASMX) Webdienste (über Windows Communication Foundation) Skripterstellung Dokumentobjektmodell |
Visuals | 2D und 3D Animation Medien (Ursprungswebsite und domänenübergreifend) Imaging/Audio/Video |
Aktuell gelesen | FlowDocuments XPS-Dokumente Eingebettete Schriftarten und Systemschriftarten CFF- und TrueType-Schriftarten |
Bearbeitung läuft | Rechtschreibprüfung RichTextBox Unterstützung der Zwischenablage bei Nur-Text und Freihand Vom Benutzer initiiertes Einfügen Kopieren von markiertem Inhalt |
Steuerelemente | Allgemeine Steuerelemente |
In dieser Tabelle sind die WPF-Funktionen in abstrahierter Form aufgeführt. Um ausführlichere Informationen bereitzustellen, sind im Windows SDK die Berechtigungen dokumentiert, die für jedes Element in WPF erforderlich sind. Zusätzlich gibt es für die folgenden Funktionen ausführlichere Informationen hinsichtlich des Ausführens bei teilweiser Vertrauenswürdigkeit, wozu auch spezielle Aspekte gehören.
XAML (siehe XAML in WPF).
Popups (siehe System.Windows.Controls.Primitives.Popup).
Drag & Drop (siehe Übersicht über Drag & Drop)
Zwischenablage (siehe System.Windows.Clipboard).
Abbildung (siehe System.Windows.Controls.Image).
Serialisierung (siehe XamlReader.Load, XamlWriter.Save).
Dialogfeld "Datei öffnen" (siehe Microsoft.Win32.OpenFileDialog).
In der folgende Tabelle sind die WPF-Funktionen erläutert, die in den Grenzen des Berechtigungssatzes für die Internetzone nicht bedenkenlos ausgeführt werden können.
Tabelle 2: WPF-Funktionen, die bei teilweiser Vertrauenswürdigkeit nicht sicher sind
Featurebereich | Funktion |
---|---|
Allgemein | Fenster (anwendungsdefinierte Fenster und Dialogfelder) SaveFileDialog Dateisystem Zugriff auf die Registrierung Drag & Drop XAML-Serialisierung (über XamlWriter.Save) UIAutomation-Clients Zugriff auf das Quellcodefenster (HwndHost) Vollständige Sprachunterstützung Windows Forms-Interoperabilität |
Visuals | Bitmapeffekte Bildcodierung |
Bearbeitung läuft | Rich-Text-Format-Zwischenablage Vollständige XAML-Unterstützung |
Programmieren für teilweise Vertrauenswürdigkeit
Bei XBAP-Anwendungen hat Code, der über den Standardberechtigungssatz hinausgeht, abhängig von der Sicherheitszone ein anderes Verhalten. In einigen Fällen erhält der Benutzer bei der Installation eine Warnung. Der Benutzer kann auswählen, ob die Installation fortgesetzt oder abgebrochen werden soll. In der folgenden Tabelle werden das Verhalten der Anwendung für jede Sicherheitszone und die erforderlichen Schritte für die volle Vertrauenswürdigkeit der Anwendung beschrieben.
Warnung
XBAPs erfordern Legacybrowser, z. B. Internet Explorer und ältere Versionen von Firefox. Diese älteren Browser werden unter Windows 10 und Windows 11 normalerweise nicht unterstützt. Moderne Browser unterstützen die für XBAP-Apps erforderliche Technologie aufgrund von Sicherheitsrisiken nicht mehr. Plug-Ins, die XBAPs aktivieren, werden nicht mehr unterstützt. Weitere Informationen finden Sie unter Häufig gestellte Fragen zu von browsergehosteten WPF-Anwendungen (XBAP).
Sicherheitszone | Verhalten | Erhalten der vollen Vertrauenswürdigkeit |
---|---|---|
Lokalem Computer | Automatisch volle Vertrauenswürdigkeit | Es ist keine Aktion erforderlich. |
Intranet und vertrauenswürdige Websites | Eingabeaufforderung für volle Vertrauenswürdigkeit | Signieren Sie die XBAP mit einem Zertifikat, damit der Benutzer die Quelle in der Eingabeaufforderung sieht. |
Internet | Schlägt fehl mit „Vertrauenswürdigkeit nicht gewährt“ | Signieren Sie die XBAP mit einem Zertifikat. |
Hinweis
Das in der vorherigen Tabelle beschriebene Verhalten gilt für vollständig vertrauenswürdige XBAPs, die nicht dem ClickOnce-Modell für vertrauenswürdige Bereitstellung entsprechen.
Bei Code, der die zulässigen Berechtigungen überschreitet, handelt es sich normalerweise um gemeinsamen Code, der von eigenständigen und im Browser gehosteten Anwendungen gemeinsam verwendet wird. CAS und WPF bieten mehrere Verfahren für die Verwaltung dieses Szenarios.
Erkennen von Berechtigungen mit CAS
In manchen Situationen kann freigegebener Code in Bibliothekassemblys sowohl von eigenständigen Anwendungen als auch von XBAPs verwendet werden. In diesen Fällen werden im Code möglicherweise Funktionen ausgeführt, die mehr Berechtigungen erfordern, als der Berechtigungssatz zulässt, der der Anwendung zugewiesen ist. Mithilfe der Microsoft .NET Framework-Sicherheit kann die Anwendung erkennen, ob sie eine bestimmte Berechtigung hat. Insbesondere kann sie prüfen, ob sie eine bestimmte Berechtigung hat, indem sie die Demand-Methode für die Instanz der gewünschten Berechtigung aufruft. Dies wird im folgenden Beispiel gezeigt, das Code enthält, der überprüft, ob er eine Datei auf dem lokalen Datenträger speichern darf:
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
Hat eine Anwendung nicht die gewünschte Berechtigung, löst der Aufruf von Demand eine Sicherheitsausnahme aus. Andernfalls wurde die Berechtigung erteilt. IsPermissionGranted
kapselt dieses Verhalten und gibt entsprechend true
oder false
zurück.
Sinnvolle Herabstufung der Funktionalität
Für Code, der aus verschiedenen Zonen ausgeführt werden, ist es sinnvoll, erkennen zu können, ob er die Berechtigung für seine auszuführenden Schritte hat. Während das Erkennen der Zone eine Geschichte ist, ist es weitaus besser, nach Möglichkeit eine Alternative für den Benutzer bereitzustellen. Beispielsweise ermöglicht eine Anwendung mit voller Vertrauenswürdigkeit Benutzern normalerweise, Dateien in beliebigen Speicherorten zu erstellen, während eine Anwendung mit teilweiser Vertrauenswürdigkeit Dateien nur in isoliertem Speicher erstellen kann. Wenn der Code zum Erstellen einer Datei in einer Assembly vorhanden ist, die sowohl von Anwendungen mit voller Vertrauenswürdigkeit (eigenständige Anwendungen) als auch von Anwendungen mit teilweiser Vertrauenswürdigkeit (im Browser gehostete Anwendungen) gemeinsam genutzt wird, und beide Anwendungen es Benutzern ermöglichen sollen, Dateien zu erstellen, muss der freigegebene Code erkennen, ob er mit voller oder teilweiser Vertrauenswürdigkeit ausgeführt wird, bevor eine Datei am entsprechenden Speicherort erstellt wird. Im folgenden Code werden beide Fälle veranschaulicht.
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
In vielen Fällen sollte es Ihnen möglich sein, eine Alternative zu teilweiser Vertrauenswürdigkeit zu finden.
In einer kontrollierten Umgebung, beispielsweise einem Intranet, können benutzerdefinierte verwaltete Frameworks über die Clientbasis im globalen Assemblycache (GAC) installiert werden. Diese Bibliotheken können Code ausführen, der volle Vertrauenswürdigkeit erfordert, und auf sie kann aus Anwendungen mit teilweiser Vertrauenswürdigkeit durch Verwenden von AllowPartiallyTrustedCallersAttribute verwiesen werden (weitere Informationen finden Sie unter Sicherheit und WPF-Sicherheitsstrategie – Plattformsicherheit).
Browserhosterkennung
Verwenden von CAS, um auf Berechtigungen zu prüfen, ist ein geeignetes Verfahren, wenn Sie auf Berechtigungsbasis prüfen müssen. Allerdings ist für dieses Verfahren das Abfangen von Ausnahmen als Teil der normalen Verarbeitung erforderlich, was grundsätzlich nicht empfehlenswert ist und Leistungsprobleme verursachen kann. Wenn Ihre XAML-Browseranwendung (XBAP) stattdessen nur innerhalb der Internetzone-Sandkasten ausgeführt wird, können Sie die BrowserInteropHelper.IsBrowserHosted-Eigenschaft verwenden, die für XAML-Browseranwendungen (XBAPs) true zurückgibt.
Warnung
XBAPs erfordern Legacybrowser, z. B. Internet Explorer und ältere Versionen von Firefox. Diese älteren Browser werden unter Windows 10 und Windows 11 normalerweise nicht unterstützt. Moderne Browser unterstützen die für XBAP-Apps erforderliche Technologie aufgrund von Sicherheitsrisiken nicht mehr. Plug-Ins, die XBAPs aktivieren, werden nicht mehr unterstützt. Weitere Informationen finden Sie unter Häufig gestellte Fragen zu von browsergehosteten WPF-Anwendungen (XBAP).
Hinweis
IsBrowserHosted erkennt nur, ob eine Anwendung in einem Browser ausgeführt wird, sie erkennt nicht, mit welchem Berechtigungssatz die Anwendung ausgeführt wird.
Verwalten von Berechtigungen
Standardmäßig werden XBAPs mit teilweiser Vertrauenswürdigkeit (Standardberechtigungssatz für die Internetzone) ausgeführt. Je nach Anforderungen der Anwendung ist es jedoch möglich, den Standardberechtigungssatz durch einen anderen Berechtigungssatz zu ersetzen. Werden beispielsweise XBAPs aus einem lokalen Intranet gestartet, kann für sie ein erweiterter Berechtigungssatz genutzt werden, der in der folgenden Tabelle gezeigt ist.
Warnung
XBAPs erfordern Legacybrowser, z. B. Internet Explorer und ältere Versionen von Firefox. Diese älteren Browser werden unter Windows 10 und Windows 11 normalerweise nicht unterstützt. Moderne Browser unterstützen die für XBAP-Apps erforderliche Technologie aufgrund von Sicherheitsrisiken nicht mehr. Plug-Ins, die XBAPs aktivieren, werden nicht mehr unterstützt. Weitere Informationen finden Sie unter Häufig gestellte Fragen zu von browsergehosteten WPF-Anwendungen (XBAP).
Tabelle 3: LocalIntranet- und Internetberechtigungen
Berechtigung | attribute | LocalIntranet | Internet |
---|---|---|---|
DNS | Zugriff auf DNS-Server | Ja | Nein |
Umgebungsvariablen | Überwachungsdaten | Ja | Nein |
Dateidialogfelder | Öffnen | Ja | Ja |
Dateidialogfelder | Nicht eingeschränkt | Ja | Nein |
Isolierte Speicherung | Assemblyisolation durch Benutzer | Ja | Nein |
Isolierte Speicherung | Unbekannte isolation | Ja | Ja |
Isolierte Speicherung | Unbegrenztes Benutzerkontingent | Ja | Nein |
Medien | Sicherheit für Audio, Video und Bilder | Ja | Ja |
Standarddruck | Ja | Nein | |
Sicheres Drucken | Ja | Ja | |
Spiegelung | Ausgabe | Ja | Nein |
Sicherheit | Ausführen von verwaltetem Code | Ja | Ja |
Sicherheit | Bestätigen von erteilten Berechtigungen | Ja | Nein |
Benutzeroberfläche | Nicht eingeschränkt | Ja | Nein |
Benutzeroberfläche | Sichere Fenster der obersten Ebene | Ja | Ja |
Benutzeroberfläche | Eigene Zwischenablage | Ja | Ja |
Webbrowser | Sichere Frame-Navigation zu HTML | Ja | Ja |
Hinweis
Ausschneiden und Einfügen ist bei teilweiser Vertrauenswürdigkeit nur bei Ausführen durch den Benutzer zulässig.
Müssen Sie Berechtigungen erhöhen, müssen Sie die Projekteinstellungen und das ClickOnce-Anwendungsmanifest ändern. Weitere Informationen finden Sie unter Übersicht über WPF-XAML-Browseranwendungen. Möglicherweise sind auch die folgenden Dokumente hilfreich.
Mage.exe (Tool zum Generieren und Bearbeiten von Manifesten)
MageUI.exe (Tool zum Generieren und Bearbeiten von Manifesten, grafischer Client)
Wenn Ihre XBAP volle Vertrauenswürdigkeit erfordert, können Sie dieselben Tools verwenden, um die erforderlichen Berechtigungen zu erhöhen. Allerdings erhält eine XBAP nur dann volle Vertrauenswürdigkeit, wenn sie auf dem lokalen Computer installiert und von diesem Computer, aus dem Intranet oder über eine URL gestartet wird, die in den vertrauenswürdigen oder zugelassenen Websites des Browsers aufgelistet ist. Wird die Anwendung aus dem Intranet oder einer vertrauenswürdigen Website installiert, wird der Benutzer durch die Standard-ClickOnce-Eingabeaufforderung über die erhöhten Berechtigungen informiert. Der Benutzer kann auswählen, ob die Installation fortgesetzt oder abgebrochen werden soll.
Alternativ können Sie das ClickOnce-Modell für vertrauenswürdige Bereitstellung für eine Bereitstellung mit voller Vertrauenswürdigkeit aus einer beliebigen Sicherheitszone verwenden. Weitere Informationen finden Sie unter Überblick über die Bereitstellung vertrauenswürdiger Anwendungen und Sicherheit.
Siehe auch
.NET Desktop feedback