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
Lecture 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.

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 Firefox. Ces versions de navigateur plus anciennes ne sont généralement pas prises 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.

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 case activée pour les autorisations est une technique appropriée lorsque vous devez case activée 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 Firefox. Ces versions de navigateur plus anciennes ne sont généralement pas prises 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.

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 Firefox. Ces versions de navigateur plus anciennes ne sont généralement pas prises 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.

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