Sicurezza con attendibilità parziale in WPF

I n generale, sarebbe opportuno limitare l'accesso diretto alle risorse critiche del sistema da parte delle applicazioni Internet in modo da impedire qualsiasi danno. Per impostazione predefinita, i linguaggi di scripting HTML e lato client non sono in grado di accedere alle risorse di sistema critiche. Poiché le applicazioni ospitate dal browser Windows Presentation Foundation (WPF) possono essere avviate dal browser, devono essere conformi a un set di restrizioni simile. Per applicare queste restrizioni, WPF si basa sia sulla sicurezza dall'accesso al codice (CAS) che su ClickOnce (vedere Strategia di sicurezza WPF - Sicurezza della piattaforma). Per impostazione predefinita, le applicazioni ospitate dal browser richiedono il set di autorizzazioni cas dell'area Internet, indipendentemente dal fatto che vengano avviate da Internet, dalla intranet locale o dal computer locale. Le applicazioni in esecuzione con un set di autorizzazioni incompleto vengono definite applicazioni in esecuzione con attendibilità parziale.

WPF offre un'ampia gamma di supporto per garantire che la maggior parte delle funzionalità possibile possa essere usata in modo sicuro in attendibilità parziale e, insieme al sito di amministrazione centrale, offre supporto aggiuntivo per la programmazione parzialmente attendibile.

Questo argomento include le sezioni seguenti:

Supporto con attendibilità parziale della funzionalità WPF

Nella tabella seguente sono elencate le funzionalità generali di Windows Presentation Foundation (WPF) che sono sicure da usare entro i limiti del set di autorizzazioni dell'area Internet.

Tabella 1: Funzionalità WPF sicure in attendibilità parziale

Area funzionalità Funzionalità
Generali Finestra del browser

Accesso al sito di origine

IsolatedStorage (limite di 512 KB)

Provider UIAutomation

Esecuzione di comandi

Input Method Editor (IME)

Stilo e input penna da tablet

Trascinamento della selezione simulato mediante eventi di acquisizione e spostamento del mouse

OpenFileDialog

Deserializzazione XAML (tramite XamlReader.Load)
Integrazione Web Finestra di dialogo di download del browser

Navigazione di primo livello avviata dall'utente

Collegamenti mailto:

Parametri URI (Uniform Resource Identifier)

HTTPWebRequest

Contenuto WPF ospitato in IFRAME

Hosting di pagine HTML dello stesso sito usando Frame

Hosting di pagine HTML dello stesso sito usando WebBrowser

Servizi Web (ASMX)

Servizi Web (mediante Windows Communication Foundation)

Esecuzione script

Document Object Model (DOM)
Elementi grafici 2D e 3D

Animazione

Elementi multimediali (sito di origine e tra domini)

Immagini/Audio/Video
Reading FlowDocument

Documenti XPS

Tipi di carattere incorporati e di sistema

Caratteri CFF e TrueType
In fase di modifica Controllo ortografico

RichTextBox

Supporto Appunti per testo non crittografato e input penna

Operazione Incolla avviata dall'utente

Copia di contenuto selezionato
Controlli Controlli generali

Questa tabella illustra le funzionalità WPF a livello generale. Per informazioni più dettagliate, Windows SDK documenta le autorizzazioni richieste da ogni membro in WPF. Inoltre, per le funzionalità seguenti sono disponibili informazioni più dettagliate sull'esecuzione in situazioni di attendibilità parziale, con alcune considerazioni speciali.

Nella tabella seguente vengono descritte le funzionalità WPF che non sono sicure per l'esecuzione entro i limiti del set di autorizzazioni dell'area Internet.

Tabella 2: Funzionalità WPF non sicure in attendibilità parziale

Area funzionalità Funzionalità
Generali Finestra (finestre e finestre di dialogo definite dall'applicazione)

SaveFileDialog

File system

Accesso al Registro di sistema

Trascinamento della selezione

Serializzazione XAML (mediante XamlWriter.Save)

Client UIAutomation

Accesso alla finestra di origine (HwndHost)

Supporto vocale completo

Interoperabilità con Windows Form
Elementi grafici Effetti bitmap

Codifica delle immagini
In fase di modifica Appunti RTF (Rich-Text Format)

Supporto XAML completo

Programmazione con attendibilità parziale

Per le applicazioni XBAP, il codice che supera il set di autorizzazioni predefinito avrà un comportamento diverso a seconda dell'area di sicurezza. In alcuni casi, l'utente riceverà un avviso quando tenta di installare il codice. L'utente potrà scegliere se continuare o annullare l'installazione. La tabella seguente descrive il comportamento dell'applicazione per ogni area di sicurezza e le azioni necessarie relative all'applicazione per acquisire attendibilità totale.

Avviso

Gli XBAP richiedono il funzionamento dei browser legacy, ad esempio Internet Explorer e Firefox. Queste versioni precedenti del browser sono in genere non supportate in Windows 10 e Windows 11. I browser moderni non supportano più la tecnologia necessaria per le app XBAP a causa di rischi per la sicurezza. I plug-in che abilitano XBAP non sono più supportati.

Area di sicurezza Comportamento Ottenere l'attendibilità totale
Computer locale Attendibilità totale automatica Non è richiesto alcun intervento.
Intranet e siti attendibili Richiesta di attendibilità totale Firma dell'applicazione XBAP con un certificato in modo che l'utente veda l'origine nel prompt.
Internet Esito negativo con "Attendibilità non concessa" Firma dell'applicazione XBAP con un certificato.

Nota

Il comportamento descritto nella tabella precedente è relativo alle applicazioni XBAP con attendibilità totale che non seguono il modello di distribuzione attendibile di ClickOnce.

In genere, è probabile che il codice che richiede autorizzazioni ulteriori rispetto a quelle consentite sia codice comune condiviso dalle applicazioni autonome e da quelle ospitate dal browser. CAS e WPF offrono diverse tecniche per la gestione di questo scenario.

Rilevamento delle autorizzazioni tramite CAS

In alcune situazioni, è possibile che il codice condiviso negli assembly di libreria venga usato dalle applicazioni autonome e dagli XBAP. In questi casi, è possibile che il codice esegua funzionalità che potrebbero richiedere un numero di autorizzazioni maggiore rispetto al set assegnato all'applicazione. L'applicazione può rilevare se dispone o meno di una determinata autorizzazione usando la sicurezza di Microsoft .NET Framework. In particolare, può verificare se dispone di un'autorizzazione specifica chiamando il Demand metodo sull'istanza dell'autorizzazione desiderata. Questa procedura è illustrata nell'esempio seguente, in cui il codice esegue una query per verificare la disponibilità dell'autorizzazione per salvare un file sul disco locale:

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

Se un'applicazione non dispone dell'autorizzazione desiderata, la chiamata a Demand genererà un'eccezione di sicurezza. In caso contrario, l'autorizzazione è disponibile. IsPermissionGranted incapsula questo comportamento e restituisce true o false in base alle esigenze.

Riduzione normale delle prestazioni della funzionalità

La capacità del codice di rilevare le autorizzazioni disponibili risulta particolarmente interessante quando il codice può essere eseguito da aree diverse. Sebbene il rilevamento dell'area sia importante, è meglio fornire un'alternativa all'utente, se possibile. Ad esempio, di solito un'applicazione con attendibilità totale consente agli utenti di creare file in qualsiasi posizione, mentre un'applicazione con attendibilità parziale consente di creare file unicamente in uno spazio di archiviazione isolato. Se il codice per la creazione di un file è contenuto in un assembly condiviso da applicazioni con attendibilità totale (autonome) e applicazioni con attendibilità parziale (ospitate dal browser) e si vuole che entrambi i tipi di applicazioni consentano la creazione di file, il codice condiviso dovrà rilevare se viene eseguito in attendibilità parziale o totale prima di creare un file nel percorso appropriato. I due casi sono illustrati nel codice seguente.

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 molte situazioni è possibile trovare un'alternativa all'attendibilità parziale.

In un ambiente controllato, ad esempio una intranet, i framework gestiti personalizzati possono essere installati nella global Assembly Cache (GAC) nella base client. Queste librerie possono eseguire codice che richiede attendibilità totale e fare riferimento alle applicazioni a cui è consentito solo l'attendibilità parziale tramite AllowPartiallyTrustedCallersAttribute . Per altre informazioni, vedere Security and WPF Security Strategy - Platform Security (Sicurezza e strategia di sicurezza WPF - Sicurezza della piattaforma).

Rilevamento host del browser

L'uso del sito di amministrazione centrale per verificare la presenza di autorizzazioni è una tecnica appropriata quando è necessario controllare in base alle autorizzazioni. Tuttavia, tale tecnica dipende dal rilevamento di eccezioni durante la normale elaborazione, operazione che in genere non è consigliata e che può causare problemi di prestazioni. Se invece l'applicazione del browser XAML (XBAP) viene eseguita solo all'interno della sandbox dell'area Internet, puoi usare la BrowserInteropHelper.IsBrowserHosted proprietà , che restituisce true per le applicazioni browser XAML (XBAP).

Avviso

Gli XBAP richiedono il funzionamento dei browser legacy, ad esempio Internet Explorer e Firefox. Queste versioni precedenti del browser sono in genere non supportate in Windows 10 e Windows 11. I browser moderni non supportano più la tecnologia necessaria per le app XBAP a causa di rischi per la sicurezza. I plug-in che abilitano XBAP non sono più supportati.

Nota

IsBrowserHosted distingue solo se un'applicazione è in esecuzione in un browser, non con quale set di autorizzazioni è in esecuzione un'applicazione.

Gestione delle autorizzazioni

Per impostazione predefinita, gli XBAP vengono eseguiti con attendibilità parziale (set di autorizzazioni predefinito dell'area Internet). Tuttavia, a seconda dei requisiti dell'applicazione, questo set predefinito può essere modificato. Ad esempio, se un XBAP viene avviato da una intranet locale, può sfruttare un set di autorizzazioni aumentato, come illustrato nella tabella seguente.

Avviso

Gli XBAP richiedono il funzionamento dei browser legacy, ad esempio Internet Explorer e Firefox. Queste versioni precedenti del browser sono in genere non supportate in Windows 10 e Windows 11. I browser moderni non supportano più la tecnologia necessaria per le app XBAP a causa di rischi per la sicurezza. I plug-in che abilitano XBAP non sono più supportati.

Tabella 3: Autorizzazioni LocalIntranet e Internet

Autorizzazione Attributo LocalIntranet Internet
DNS Accesso ai server DNS No
Variabili di ambiente Lettura No
Finestre di dialogo file Apertura
Finestre di dialogo file Senza restrizioni No
Spazio di memorizzazione isolato Isolamento assembly in base all'utente No
Spazio di memorizzazione isolato Isolamento sconosciuto
Spazio di memorizzazione isolato Quota utenti illimitata No
File media Audio, video e immagini sicuri
Stampa Stampa predefinita No
Stampa Stampa sicura
Riflessione Emissione No
Sicurezza Esecuzione del codice gestito
Sicurezza Asserzione autorizzazioni concesse No
Interfaccia utente Senza restrizioni No
Interfaccia utente Finestre di primo livello sicure
Interfaccia utente Appunti personali
Web browser Navigazione sicura dei frame in HTML

Nota

L'operazione di taglia e incolla, se avviata dall'utente, è consentita solo con l'attendibilità parziale.

Per aumentare il numero di autorizzazioni, è necessario modificare le impostazioni del progetto e il manifesto dell'applicazione ClickOnce. Per altre informazioni, vedere Panoramica delle applicazioni browser XAML di WPF. Anche i seguenti documenti possono rivelarsi utili.

Se XBAP richiede l'attendibilità totale, è possibile usare gli stessi strumenti per aumentare le autorizzazioni richieste. Anche se un XBAP riceverà l'attendibilità totale se è installato e avviato dal computer locale, dalla intranet o da un URL elencato nei siti attendibili o consentiti del browser. Se l'applicazione viene installata dalla Intranet o da un sito attendibile, verrà visualizzato all'utente il prompt standard di ClickOnce con la notifica relativa alle autorizzazioni elevate. L'utente potrà scegliere se continuare o annullare l'installazione.

In alternativa, è possibile usare il modello di distribuzione attendibile di ClickOnce per una distribuzione con attendibilità totale da qualsiasi area di sicurezza. Per altre informazioni, vedere Panoramica della distribuzione di applicazioni attendibili e Sicurezza.

Vedi anche