Sécurité de confiance partielle de WPF
En général, les applications Internet doivent disposer d’un accès direct limité aux ressources système critiques, afin d’éviter des dommages dus à des actes de malveillance. Par défaut, les langages de script HTML et côté client ne sont pas en mesure d’accéder aux ressources système critiques. Étant donné que les applications hébergées par le navigateur Windows Presentation Foundation (WPF) peuvent être lancées à partir du navigateur, elles doivent être conformes à un ensemble similaire de restrictions. Pour appliquer ces restrictions, WPF s’appuie sur la sécurité d’accès au code (CAS) et sur ClickOnce (voir Stratégie de sécurité WPF - Sécurité de la plateforme). Par défaut, les applications hébergées par navigateur demandent l’ensemble d’autorisations d’administration centrale de zone Internet, qu’elles soient lancées à partir d’Internet, de l’intranet local ou de l’ordinateur local. Les applications qui sont exécutées sans jeu d’autorisations complet sont exécutées avec une confiance dite partielle.
WPF fournit un large éventail de prise en charge pour s’assurer que la plupart des fonctionnalités possibles peuvent être utilisées en toute sécurité dans la confiance partielle, et avec le cas, fournit une prise en charge supplémentaire pour la programmation de confiance partielle.
Cette rubrique contient les sections suivantes :
Prise en charge de la confiance partielle avec des fonctionnalités WPF
Le tableau suivant répertorie les fonctionnalités générales de Windows Presentation Foundation (WPF) qui sont sécurisées à utiliser dans les limites du jeu d’autorisations de zone Internet.
Tableau 1 : Fonctionnalités WPF pouvant être utilisées en toute sécurité avec une confiance partielle
Zone Fonctionnalités | Fonctionnalité |
---|---|
Général | Fenêtre du navigateur Accès au site d’origine IsolatedStorage (limité à 512 Ko) Fournisseurs UIAutomation Commandes Éditeurs de méthode d’entrée (IME) Stylet et entrée manuscrite Glisser-déplacer simulé à l’aide d’événements de capture de la souris et de déplacement OpenFileDialog Désérialisation XAML (à l’aide de XamlReader.Load) |
Intégration web | Boîte de dialogue de téléchargement dans un navigateur Navigation de premier niveau lancée par l’utilisateur mailto:Links Paramètres de l’URI (Uniform Resource Identifier) HTTPWebRequest Contenu WPF hébergé dans un IFRAME Hébergement de pages HTML d’un même site à l’aide d’un Frame Hébergement de pages HTML d’un même site à l’aide d’un WebBrowser Services web (ASMX) Services web (utilisant Windows Communication Foundation) Scripts DOM (Document Object Model) |
Objets visuels | 2D et 3D Animation Média (site d’origine et interdomaines) Images/Audio/Vidéo |
Reading | FlowDocuments Documents XPS Polices système et incorporées Polices CFF et TrueType |
Modification | Vérification de l’orthographe RichTextBox Prise en charge du Presse-papiers pour les entrées manuscrites et le texte en clair Coller à l’initiative de l’utilisateur Copie du contenu sélectionné |
Contrôles | Contrôles généraux |
Ce tableau couvre les fonctionnalités WPF à un niveau élevé. Pour plus d’informations, le Kit de développement logiciel (SDK) Windows documente les autorisations requises par chaque membre dans WPF. De plus, les fonctionnalités suivantes proposent des informations plus détaillées concernant l’exécution en mode confiance partielle, notamment des considérations spéciales.
XAML (voir XAML dans WPF).
Fenêtres contextuelles (voir System.Windows.Controls.Primitives.Popup).
Glisser-déplacer (voir Vue d’ensemble du glisser-déplacer).
Presse-papiers (voir System.Windows.Clipboard).
Imagerie (voir System.Windows.Controls.Image).
Sérialisation (voir XamlReader.Load, XamlWriter.Save).
Ouvrir une boîte de dialogue Fichier (voir Microsoft.Win32.OpenFileDialog).
Le tableau suivant présente les fonctionnalités WPF qui ne sont pas sécurisées pour s’exécuter dans les limites du jeu d’autorisations de zone Internet.
Tableau 2 : Fonctionnalités WPF ne pouvant pas être utilisées en toute sécurité avec une confiance partielle
Zone Fonctionnalités | Fonctionnalité |
---|---|
Général | Fenêtre (boîtes de dialogue et fenêtres définies par l’application) SaveFileDialog Système de fichiers Accès au Registre Glisser-déposer Sérialisation XAML (à l’aide de XamlWriter.Save) Clients UIAutomation Accès à la fenêtre source (HwndHost) Prise en charge vocale intégrale Interopérabilité Windows Forms |
Objets visuels | Effets bitmap Encodage d’images |
Modification | Presse-papiers RTF (Rich Text Format) Prise en charge XAML intégrale |
Programmation de la confiance partielle
Pour les applications XBAP, le code qui dépasse le jeu d’autorisations par défaut aura un comportement différent en fonction de la zone de sécurité. Dans certains cas, l’utilisateur reçoit un avertissement quand il tente de l’installer. Il peut choisir de continuer ou d’annuler l’installation. Le tableau suivant décrit le comportement de l’application pour chaque zone de sécurité et ce que vous devez faire pour que l’application reçoive la confiance totale.
Avertissement
Les XBAPs nécessitent que les navigateurs hérités fonctionnent, tels qu’Internet Explorer et les anciennes versions de Firefox. Ces navigateurs plus anciens ne sont généralement pas pris en charge sur Windows 10 et Windows 11. Les navigateurs modernes ne prennent plus en charge la technologie requise pour les applications XBAP en raison des risques de sécurité. Les plug-ins qui activent les XBAPs ne sont plus pris en charge. Pour plus d’informations, consultez forum aux questions sur les applications hébergées par un navigateur WPF (XBAP) .
Zone de sécurité | Comportement | Obtention de la confiance totale |
---|---|---|
Ordinateur local | Confiance totale automatique | Aucune action n'est nécessaire. |
Intranet et sites de confiance | Invite pour la confiance totale | Signez l’application XBAP avec un certificat afin que l’utilisateur consulte la source dans l’invite. |
Internet | Échec avec "Confiance non accordée" | Signez l’application XBAP avec un certificat. |
Remarque
Le comportement décrit dans le tableau précédent concerne les applications XBAP de confiance totale qui ne suivent pas le modèle de déploiement approuvé ClickOnce.
En général, le code qui outrepasse les permissions autorisées est susceptible d’être du code commun qui est partagé entre des applications hébergées par le navigateur et des applications autonomes. CAS et WPF offrent plusieurs techniques de gestion de ce scénario.
Détermination des autorisations à l’aide de la sécurité d’accès du code
Dans certains cas, il est possible que le code partagé dans les assemblys de bibliothèque soit utilisé par les applications autonomes et les XBAPs. Le code risque alors d’exécuter des fonctionnalités qui pourraient nécessiter plus d’autorisations que celles accordées par le jeu d’autorisations de l’application. Votre application peut détecter si elle dispose ou non d’une certaine autorisation à l’aide de la sécurité de Microsoft .NET Framework. Plus précisément, il peut tester s’il dispose d’une autorisation spécifique en appelant la Demand méthode sur l’instance de l’autorisation souhaitée. Ce test est illustré dans l’exemple suivant, dans lequel le code vérifie s’il peut enregistrer un fichier sur le disque local :
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
Si une application n’a pas l’autorisation souhaitée, l’appel à Demand levera une exception de sécurité. Sinon, l’autorisation a été accordée. IsPermissionGranted
encapsule ce comportement et retourne true
ou false
le cas échéant.
Dégradation progressive des fonctionnalités
Pour du code qui peut être exécuté à partir de différentes zones, il est intéressant de pouvoir déterminer si une autorisation de faire ce qu’il a besoin de faire lui est accordée ou non. Même si la détermination de la zone est un élément, il est de loin préférable de proposer, si possible, une alternative à l’utilisateur. Par exemple, une application de confiance totale permet généralement aux utilisateurs de créer des fichiers où ils le souhaitent, alors qu’une application de confiance partielle peut créer des fichiers uniquement dans un stockage isolé. Si le code permettant de créer un fichier figure dans un assembly qui est partagé à la fois par des applications de confiance totale (autonomes) et des applications de confiance partielle (hébergées par le navigateur), et que les utilisateurs doivent pouvoir créer des fichiers dans ces deux types d’applications, le code partagé doit déterminer s’il est exécuté avec une confiance partielle ou totale avant de créer un fichier à l’emplacement approprié. Le code suivant illustre ces deux cas de figure.
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
Dans de nombreux cas, vous devez pouvoir trouver une alternative à la confiance partielle.
Dans un environnement contrôlé, tel qu’un intranet, des frameworks managés personnalisés peuvent être installés sur la base cliente dans le Global Assembly Cache (GAC). Ces bibliothèques peuvent exécuter du code nécessitant une confiance totale et être référencées à partir d’applications qui ne sont autorisées qu’à l’aide AllowPartiallyTrustedCallersAttribute d’une approbation partielle (pour plus d’informations, consultez Sécurité et stratégie de sécurité WPF - Sécurité de la plateforme).
Détermination de l’hôte de navigateur
L’utilisation du système d’administration centrale pour vérifier les autorisations est une technique appropriée lorsque vous devez vérifier par autorisation. Cette technique dépend toutefois de l’interception des exceptions dans le cadre d’un traitement normal, ce qui n’est généralement pas recommandé et peut entraîner des problèmes de performances. Au lieu de cela, si votre application de navigateur XAML (XBAP) s’exécute uniquement dans le bac à sable de zone Internet, vous pouvez utiliser la BrowserInteropHelper.IsBrowserHosted propriété, qui retourne true pour les applications de navigateur XAML (XBAPs).
Avertissement
Les XBAPs nécessitent que les navigateurs hérités fonctionnent, tels qu’Internet Explorer et les anciennes versions de Firefox. Ces navigateurs plus anciens ne sont généralement pas pris en charge sur Windows 10 et Windows 11. Les navigateurs modernes ne prennent plus en charge la technologie requise pour les applications XBAP en raison des risques de sécurité. Les plug-ins qui activent les XBAPs ne sont plus pris en charge. Pour plus d’informations, consultez forum aux questions sur les applications hébergées par un navigateur WPF (XBAP) .
Remarque
IsBrowserHosted distingue uniquement si une application est en cours d’exécution dans un navigateur, et non pas avec quel ensemble d’autorisations une application est en cours d’exécution.
Gestion des autorisations
Par défaut, les adresses XBAPs s’exécutent avec une approbation partielle (jeu d’autorisations de zone Internet par défaut). En fonction des spécifications de l’application, il est toutefois possible de changer le jeu d’autorisations par défaut. Par exemple, si un XBAPs est lancé à partir d’un intranet local, il peut tirer parti d’un jeu d’autorisations accru, illustré dans le tableau suivant.
Avertissement
Les XBAPs nécessitent que les navigateurs hérités fonctionnent, tels qu’Internet Explorer et les anciennes versions de Firefox. Ces navigateurs plus anciens ne sont généralement pas pris en charge sur Windows 10 et Windows 11. Les navigateurs modernes ne prennent plus en charge la technologie requise pour les applications XBAP en raison des risques de sécurité. Les plug-ins qui activent les XBAPs ne sont plus pris en charge. Pour plus d’informations, consultez forum aux questions sur les applications hébergées par un navigateur WPF (XBAP) .
Tableau 3 : Autorisations LocalIntranet et Internet
Autorisation | Attribut | LocalIntranet | Internet |
---|---|---|---|
DNS | Serveurs d’accès DNS | Oui | Non |
Variables d'environnement | Lire | Oui | Non |
Boîtes de dialogue de fichiers | En cours | Oui | Oui |
Boîtes de dialogue de fichiers | Non restreint | Oui | Non |
Stockage isolé | Isolement de l’assembly par utilisateur | Oui | Non |
Stockage isolé | Isolement inconnu | Oui | Oui |
Stockage isolé | Quota utilisateur illimité | Oui | Non |
Média | Images, vidéo et audio sécurisés | Oui | Oui |
Impression | Impression par défaut | Oui | Non |
Impression | Impression sécurisée | Oui | Oui |
Réflexion | Émission | Oui | Non |
Sécurité | Exécution du code managé | Oui | Oui |
Sécurité | Déclarer des autorisations accordées | Oui | Non |
Interface utilisateur | Non restreint | Oui | Non |
Interface utilisateur | Fenêtres de niveau supérieur sécurisées | Oui | Oui |
Interface utilisateur | Presse-papiers personnel | Oui | Oui |
Navigateur web | Navigation de frame sécurisée vers HTML | Oui | Oui |
Remarque
Le couper-coller est autorisé uniquement en mode confiance partielle quand il est à l’initiative de l’utilisateur.
Si vous devez augmenter le niveau d’autorisation, vous devez changer les paramètres du projet et le manifeste de l’application ClickOnce. Pour plus d’informations, consultez Vue d’ensemble des applications de navigateur XAML. Les documents suivants peuvent également être utiles.
Si votre XBAP nécessite une confiance totale, vous pouvez utiliser les mêmes outils pour augmenter les autorisations demandées. Bien qu’un XBAP reçoive uniquement une confiance totale s’il est installé et lancé à partir de l’ordinateur local, de l’intranet ou d’une URL répertoriée dans les sites approuvés ou autorisés du navigateur. Si l’application est installée à partir de l’intranet ou d’un site de confiance, l’utilisateur reçoit l’invite ClickOnce standard lui signalant les autorisations élevées. Il peut choisir de continuer ou d’annuler l’installation.
Vous pouvez également utiliser le modèle de déploiement approuvé ClickOnce pour le déploiement en mode confiance totale à partir de toute zone de sécurité. Pour plus d’informations, consultez Vue d’ensemble des applications du navigateur XAML WPF et Sécurité.
Voir aussi
.NET Desktop feedback