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.

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 Firefox. Diese älteren Browserversionen 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.

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 Firefox. Diese älteren Browserversionen 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.

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 Firefox. Diese älteren Browserversionen 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.

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
Drucken Standarddruck Ja Nein
Drucken 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.

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