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.
XAML (siehe Übersicht über XAML (WPF)).
Popups (siehe System.Windows.Controls.Primitives.Popup).
Drag & Drop (siehe Übersicht über Drag & Drop).
Zwischenablage (siehe System.Windows.Clipboard).
Imaging (siehe System.Windows.Controls.Image).
Serialisierung (siehe XamlReader.Load, XamlWriter.Save).
Dialogfeld Datei öffnen (siehe Microsoft.Win32.OpenFileDialog).
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. |
Hinweis |
---|
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.
Hinweis |
---|
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 |
Standarddruck |
Ja |
Nein |
|
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 |
Hinweis |
---|
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.
Mage.exe (Tool zum Generieren und Bearbeiten von Manifesten).
MageUI.exe (Tool zum Generieren und Bearbeiten von Manifesten, grafischer Client).
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).