WPF-Sicherheit mit teilweiser Vertrauenswürdigkeit

Im Allgemeinen sollte der direkte Zugriff von Internetanwendungen auf wichtige Systemressourcen beschränkt werden, um böswillige Beschädigungen zu vermeiden. Standardmäßig können HTML und clientseitige Skriptsprachen nicht auf wichtige Systemressourcen zugreifen. Da im Browser gehostete Windows Presentation Foundation (WPF)-Anwendungen vom Browser aus 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 (siehe WPF-Sicherheitsstrategie – Plattformsicherheit). Standardmäßig fordern im Browser gehostete Anwendungen den CAS-Berechtigungssatz für die Internetzone an. Dies geschieht unabhängig davon, ob diese Anwendungen vom Internet, dem lokalen Intranet oder dem lokalen Computer aus gestartet werden. Anwendungen, die nicht mit einem Berechtigungssatz ausgeführt werden, der nicht dem vollen Berechtigungssatz entspricht, werden mit teilweiser Vertrauenswürdigkeit ausgeführt.

WPF bietet viele Arten der Unterstützung, um sicherzustellen, dass bei teilweiser Vertrauenswürdigkeit möglichst viele Funktionen sicher ausgeführt werden können, und bietet zusammen mit CAS zusätzliche Unterstützung für die Programmierung mit teilweiser Vertrauenswürdigkeit.

Dieses Thema enthält folgende Abschnitte:

  • WPF-Features für die Unterstützung von teilweiser Vertrauenswürdigkeit

  • Programmierung mit teilweiser Vertrauenswürdigkeit

  • Verwalten von Berechtigungen

WPF-Features für die Unterstützung von teilweiser Vertrauenswürdigkeit

Die folgende Tabelle enthält die wichtigsten Funktionen von Windows Presentation Foundation (WPF), die unbedenklich im Rahmen des Berechtigungssatzes für die Internetzone verwendet werden können.

Tabelle 1: Sichere WPF-Features bei teilweiser Vertrauenswürdigkeit

Funktionsbereich

Feature

Allgemein

Browserfenster

Zugriff auf die Ursprungssite

IsolatedStorage (beschränkt auf 512 KB)

UIAutomation-Anbieter

Befehle

Eingabemethoden-Editoren (IMEs)

Tablettstift und Freihandeingabe

Simuliertes Drag & Drop mit Ereignissen zur Mausaufzeichnung und zum Verschieben

OpenFileDialog

XAML-Deserialisierung (über XamlReader.Load)

Webintegration

Download-Dialogfeld des Browsers

Vom Benutzer initiierte Navigation der obersten Ebene

mailto:links

Uniform Resource Identifier-Parameter

HTTPWebRequest

In einem IFRAME gehosteter WPF-Inhalt

Hosten von HTML-Seiten mithilfe eines Frames

Hosten von HTML-Seiten mithilfe eines Webbrowsers

Webdienste (ASMX)

Webdienste (Verwendung von Windows Communication Foundation)

Skripterstellung

Dokumentobjektmodell

Darstellung

2D und 3D

Animation

Medien (Ursprungssite und domänenübergreifend)

Imaging/Audio/Video

Lesen

FlowDocuments

XPS-Dokumente

Eingebettete Schriftarten & Systemschriftarten

CFF- & TrueType-Schriftarten

Bearbeiten

Rechtschreibprüfung

RichTextBox

Unterstützung der Zwischenablage bei Nur-Text und Freihand

Vom Benutzer initiiertes Einfügen

Kopieren von ausgewähltem Inhalt

Steuerelemente

Allgemeine Steuerelemente

Diese Tabelle enthält die wichtigsten WPF-Features. Ausführlichere Informationen finden Sie in Windows Software Development Kit (SDK). Hier werden die für jedes Member in WPF erforderlichen Berechtigungen dokumentiert. Darüber hinaus weisen die folgenden Funktionen ausführlichere Informationen hinsichtlich der Ausführung unter teilweiser Vertrauenswürdigkeit auf, einschließlich besonderer Überlegungen.

Die folgende Tabelle enthält die WPF-Funktionen, die im Rahmen des Berechtigungssatzes für die Internetzone nicht unbedenklich verwendet werden können.

Tabelle 2: WPF-Features, die bei teilweiser Vertrauenswürdigkeit nicht sicher sind

Funktionsbereich

Feature

Allgemein

Fenster (anwendungsdefinierte Fenster und Dialogfelder)

SaveFileDialog

Dateisystem

Registrierungszugriff

Drag & Drop

XAML-Serialisierung (über XamlWriter.Save)

UIAutomation-Clients

Zugriff auf das Quellcodefenster (HwndHost)

Vollständige Sprachunterstützung

Windows Forms-Interoperabilität

Darstellung

Bitmapeffekte

Bildcodierung

Bearbeiten

Rich Text Format-Zwischenablage

Vollständige XAML-Unterstützung

Programmierung mit teilweiser Vertrauenswürdigkeit

Bei XBAP-Anwendungen weist Code, der über den Standardberechtigungssatz hinausgeht, abhängig von der Sicherheitszone ein anderes Verhalten auf. 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.

Sicherheitszone

Verhalten

Erhalten der vollen Vertrauenswürdigkeit

Lokaler Computer

Automatische volle Vertrauenswürdigkeit

Es ist keine Aktion erforderlich.

Intranet und vertrauenswürdige Sites

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.

HinweisHinweis

Das in der vorherigen Tabelle beschriebene Verhalten gilt für vollständig vertrauenswürdige XBAPs, die nicht dem ClickOnce Trusted Bereitstellungsmodell folgen.

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 mithilfe der Codezugriffssicherheit (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 vom Code möglicherweise Funktionen ausgeführt, für die Berechtigungen erforderlich sind, die über den der Anwendung zugewiesenen Berechtigungssatz hinausgehen. Mithilfe der Microsoft .NET Framework-Sicherheit kann die Anwendung erkennen, ob sie über eine bestimmte Berechtigung verfügt. Insbesondere kann sie prüfen, ob sie über eine bestimmte Berechtigung verfügt, indem sie die Demand-Methode auf der Instanz der gewünschten Berechtigung aufruft. Dies wird im folgenden Beispiel gezeigt. Dieses Beispiel enthält Code, der überprüft, ob er die Fähigkeit besitzt, eine Datei auf dem lokalen Datenträger zu speichern:


Imports System.IO ' File, FileStream, StreamWriter
Imports System.IO.IsolatedStorage ' IsolatedStorageFile
Imports System.Security ' CodeAccesPermission, IsolatedStorageFileStream
Imports System.Security.Permissions ' FileIOPermission, FileIOPermissionAccess
Imports System.Windows ' MessageBox

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
using System.IO; // File, FileStream, StreamWriter
using System.IO.IsolatedStorage; // IsolatedStorageFile
using System.Security; // CodeAccesPermission, IsolatedStorageFileStream
using System.Security.Permissions; // FileIOPermission, FileIOPermissionAccess
using System.Windows; // MessageBox

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;
            }
        }



...


    }
}

Wenn eine Anwendung die gewünschte Berechtigung nicht besitzt, löst der Aufruf von Demand eine Sicherheitsausnahme aus. Andernfalls wurde die Berechtigung gewährt. IsPermissionGranted kapselt dieses Verhalten und gibt jeweils true oder false zurück.

Ordnungsgemäße Verringerung der Funktionalität

Die Fähigkeit, festzustellen, ob Code die Berechtigung besitzt, nötige Funktionen auszuführen, ist für Code interessant, der von verschiedenen Zonen aus ausgeführt werden kann. Das Erkennen der Zone ist zwar eine wichtige Funktion, jedoch ist es generell vorzuziehen, wenn möglich eine Alternative für den Benutzer bereitzustellen. So ermöglicht eine Anwendung mit voller Vertrauenswürdigkeit Benutzern normalerweise, an jeder beliebigen Stelle Dateien zu erstellen, während eine Anwendung mit teilweiser Vertrauenswürdigkeit nur in der isolierten Speicherung Dateien 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, sollte der freigegebene Code feststellen, 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.


Imports System.IO ' File, FileStream, StreamWriter
Imports System.IO.IsolatedStorage ' IsolatedStorageFile
Imports System.Security ' CodeAccesPermission
Imports System.Security.Permissions ' FileIOPermission, FileIOPermissionAccess
Imports System.Windows ' MessageBox

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
using System.IO; // File, FileStream, StreamWriter
using System.IO.IsolatedStorage; // IsolatedStorageFile
using System.Security; // CodeAccesPermission
using System.Security.Permissions; // FileIOPermission, FileIOPermissionAccess
using System.Windows; // MessageBox

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;
            }
        }



...


    }
}

In vielen Fällen sollte es Ihnen möglich sein, eine Alternative mit teilweiser Vertrauenswürdigkeit zu finden.

In einer kontrollierten Umgebung, wie beispielsweise einem Intranet, können benutzerdefinierte verwaltete Frameworks über die Client-Basis in den global assembly cache (GAC) installiert werden. Diese Bibliotheken können Code ausführen, der volle Vertrauenswürdigkeit erfordert, und auf sie kann von Anwendungen mit teilweiser Vertrauenswürdigkeit aus mithilfe von AllowPartiallyTrustedCallersAttribute verwiesen werden (weitere Informationen finden Sie unter Sicherheit (WPF) und WPF-Sicherheitsstrategie – Plattformsicherheit).

Browserhosterkennung

Das Verwenden von CAS zum Überprüfen von Berechtigungen ist ein geeignetes Verfahren, wenn Sie auf Berechtigungsbasis überprüfen müssen. Dieses Verfahren hängt jedoch davon ab, ob Ausnahmen als Teil der normalen Verarbeitung abgefangen werden, was im Allgemeinen nicht empfehlenswert ist und sich auf die Leistung auswirken kann. Wenn Ihre XAML browser application (XBAP) nur in der Sandbox der Internetzone ausgeführt wird, können Sie die BrowserInteropHelper.IsBrowserHosted-Eigenschaft verwenden, die für XAML browser applications (XBAPs) "true" zurückgibt.

HinweisHinweis

IsBrowserHosted erkennt nur, ob eine Anwendung in einem Browser ausgeführt wird. Es wird nicht erkannt, mit welchem Berechtigungssatz eine Anwendung ausgeführt wird.

Verwalten von Berechtigungen

Standardmäßig werden XBAPs mit teilweiser Vertrauenswürdigkeit (Standardberechtigungssatz für die Internetzone) ausgeführt. Je nach den Anforderungen der Anwendung ist es jedoch möglich, den Berechtigungssatz zu ändern. Wenn beispielsweise XBAPs von einem lokalen Intranet aus gestartet werden, können sie von einem erweiterten Berechtigungssatz profitieren, wie in der folgenden Tabelle gezeigt wird.

Tabelle 3: LocalIntranet und Internetberechtigungen

Berechtigung

Attribut

LocalIntranet

Internet

DNS

Zugriff DNS-Server

Ja

Nein

Umgebungsvariablen

Thema

Ja

Nein

Dateidialogfelder

Öffnen Sie .

Ja

Ja

Dateidialogfelder

Uneingeschränkt

Ja

Nein

Isolierte Speicherung

Assemblyisolation nach 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

Reflektion

Ausgabe

Ja

Nein

Sicherheit

Ausführen von verwaltetem Code

Ja

Ja

Sicherheit

Bestätigen von gewährten Berechtigungen

Ja

Nein

Benutzeroberfläche

Uneingeschrä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

HinweisHinweis

Ausschneiden und Einfügen ist nur bei Initialisierung durch den Benutzer unter teilweiser Vertrauenswürdigkeit zulässig.

Wenn Sie Berechtigungen erweitern müssen, 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 die XBAP volle Vertrauenswürdigkeit erfordert, können Sie die gleichen Tools verwenden, um die erforderlichen Berechtigungen zu erweitern. Allerdings erhält eine XBAP nur dann volle Vertrauenswürdigkeit, wenn sie auf dem lokalen Computer installiert und von diesem Computer, dem Intranet oder einer URL, die als vertrauenswürdige oder zugelassene Website aufgelistet ist, gestartet wird. Wenn die Anwendung vom Intranet oder einer vertrauenswürdigen Website installiert ist, 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 vertrauenswürdige ClickOnce-Bereitstellungsmodell für die voll vertrauenswürdige Bereitstellung aus einer beliebigen Sicherheitszone verwenden. Weitere Informationen finden Sie unter Überblick über die Bereitstellung vertrauenswürdiger Anwendungen und Sicherheit (WPF).

Siehe auch

Konzepte

Sicherheit (WPF)

WPF-Sicherheitsstrategie – Plattformsicherheit

WPF-Sicherheitsstrategie – Sicherheitsentwicklung