Condividi tramite


Sicurezza WPF a attendibilità parziale

In generale, le applicazioni Internet devono essere limitate dall'accesso diretto alle risorse di sistema critiche, per evitare danni dannosi. 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 nel browser richiedono il set di autorizzazioni CAS dell'area Internet, indipendentemente dal fatto che vengano eseguite da Internet, dalla intranet locale o dal computer locale. Le applicazioni che vengono eseguite con meno del set completo di autorizzazioni vengono dette 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 a CAS (Code Access Security), offre supporto aggiuntivo per la programmazione in parziale attendibilità.

Questo argomento contiene le sezioni seguenti:

Supporto di attendibilità parziale delle 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 contesti di attendibilità parziale

Area delle funzionalità Caratteristica
Generale Finestra del browser

Accesso al sito di origine

IsolatedStorage (limite di 512 KB)

Provider uiAutomation

Comandante

Editor di metodi di input (IMEs)

Pennino e inchiostro per tablet

Trascinamento/rilascio simulato con eventi di acquisizione e spostamento del mouse

OpenFileDialog

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

Navigazione Top-Level User-Initiated

mailto:links

Parametri dell'Identificatore Uniforme di Risorsa

HTTPWebRequest

Contenuto WPF ospitato in un IFRAME

Hosting di pagine HTML Same-Site tramite frame

Hosting di pagine HTML dello stesso sito tramite WebBrowser

Servizi Web (ASMX)

Servizi Web (con Windows Communication Foundation)

Scripting

Modello di oggetti documento
Immagini 2D e 3D

Animazione

Media (sito di origine e tra domini diversi)

Imaging/Audio/Video
Lettura FlowDocuments

Documenti XPS

Font di sistema & incorporati

Tipi di carattere CFF & TrueType
Redazione Controllo ortografico

RichTextBox

Supporto per appunti in testo in chiaro e penna

User-Initiated Incolla

Copia del 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, le seguenti funzionalità includono informazioni più dettagliate sull'esecuzione sotto attendibilità parziale, comprese 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 con attendibilità parziale

Area delle funzionalità Caratteristica
Generale Finestra (finestre e finestre di dialogo definite dall'applicazione)

Finestra di dialogo Salva File

Sistema di File

Accesso al Registro di sistema

Trascinare e rilasciare

Serializzazione XAML (tramite XamlWriter.Save)

Clienti UIAutomation

Accesso alla finestra sorgente (HwndHost)

Supporto vocale completo

Interoperabilità di Windows Form
Immagini Effetti bitmap

Codifica delle immagini
Redazione Appunti in formato RTF

Supporto XAML completo

Programmazione a fiducia 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 installarlo. L'utente può scegliere di continuare o annullare l'installazione. La tabella seguente descrive il comportamento dell'applicazione per ogni zona di sicurezza e le operazioni da eseguire affinché l'applicazione riceva l'attendibilità totale.

Avvertimento

I file XBAP richiedono il funzionamento di browser legacy, ad esempio Internet Explorer e versioni precedenti di Firefox. Questi browser meno recenti sono in genere non supportati 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. Per altre informazioni, vedere domande frequenti sulle applicazioni ospitate dal browser WPF (XBAP).

Area di sicurezza Comportamento Ottenere l'attendibilità totale
Computer locale Attendibilità totale automatica Non è necessaria alcuna azione.
Siti Intranet e fidati Richiedi attendibilità totale Firmare XBAP con un certificato in modo che l'utente visualizzi l'origine nel prompt.
Internet Errore con "Attendibilità non concessa" Firmare l'XBAP con un certificato.

Nota

Il comportamento descritto nella tabella precedente è relativo agli XBAP con attendibilità totale che non seguono il modello clickOnce Trusted Deployment.

In generale, il codice che può superare le autorizzazioni consentite è probabilmente codice comune condiviso tra applicazioni autonome e ospitate nel browser. CAS e WPF offrono diverse tecniche per la gestione di questo scenario.

Rilevamento delle autorizzazioni utilizzando CAS

In alcune situazioni, è possibile che il codice condiviso negli assembly di libreria venga usato dalle applicazioni autonome e dagli XBAP. In questi casi, il codice può eseguire funzionalità che potrebbero richiedere più autorizzazioni rispetto al set di autorizzazioni concesso dall'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 metodo Demand sull'istanza dell'autorizzazione desiderata. Questo è illustrato nell'esempio seguente, con codice che esegue una query per verificare se è in grado di salvare un file nel 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 è stata concessa. IsPermissionGranted incapsula questo comportamento e restituisce true o false in base alle esigenze.

Degradazione graduale delle funzionalità

Essere in grado di rilevare se il codice ha l'autorizzazione per eseguire le operazioni necessarie è interessante per il codice che può essere eseguito da zone diverse. Anche se il rilevamento della zona è una cosa, è molto meglio fornire un'alternativa per l'utente, se possibile. Ad esempio, un'applicazione con attendibilità totale consente in genere agli utenti di creare file ovunque desiderino, mentre un'applicazione parzialmente attendibile può creare solo file in uno spazio di archiviazione isolato. Se il codice per creare un file esiste in un assembly condiviso da applicazioni con attendibilità totale (autonoma) e applicazioni parzialmente attendibili (ospitate dal browser) e entrambe le applicazioni vogliono che gli utenti possano creare file, il codice condiviso deve rilevare se è in esecuzione in modo parziale o completo prima di creare un file nel percorso appropriato. Il codice seguente illustra entrambi.

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 molti casi, dovresti essere in grado di trovare un'alternativa di 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 l'attendibilità totale ed essere referenziate dalle applicazioni alle quali è consentito solo l'attendibilità parziale usando AllowPartiallyTrustedCallersAttribute (per ulteriori informazioni, vedere Sicurezza e Strategia di sicurezza WPF - Sicurezza della piattaforma).

Rilevamento host browser

L'uso di CAS per verificare le autorizzazioni è una tecnica appropriata quando è necessario controllare ciascuna autorizzazione singolarmente. Anche se questa tecnica dipende dall'intercettazione delle eccezioni come parte della normale elaborazione, che non è consigliata in generale e può avere problemi di prestazioni. Se invece l'applicazione del browser XAML (XBAP) viene eseguita solo all'interno della sandbox dell'area Internet, puoi usare la proprietà BrowserInteropHelper.IsBrowserHosted, che restituisce true per le applicazioni del browser XAML (XBAP).

Avvertimento

Per funzionare, i file XBAP richiedono browser legacy, come Internet Explorer e vecchie versioni di Firefox. Questi browser meno recenti sono in genere non supportati 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. Per altre informazioni, vedere domande frequenti sulle applicazioni ospitate dal browser WPF (XBAP).

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, è possibile modificare il set di autorizzazioni rispetto all'impostazione predefinita. Ad esempio, se un XBAP viene avviato da una intranet locale, può sfruttare un set di autorizzazioni aumentato, come illustrato nella tabella seguente.

Avvertimento

I file XBAP richiedono il funzionamento di browser legacy, ad esempio Internet Explorer e versioni precedenti di Firefox. Questi browser meno recenti sono in genere non supportati 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. Per ulteriori informazioni, vedere Domande frequenti sulle applicazioni WPF ospitate in un browser (XBAP).

Tabella 3: Autorizzazioni LocalIntranet e Internet

Permesso Attributo LocalIntranet Internet
DNS Accedere ai server DNS No
Variabili di ambiente Leggere No
Finestre di dialogo per file Aperto
Finestre di dialogo dei file Illimitato No
Spazio di memorizzazione isolato Isolamento dell'assembly da parte dell'utente No
Spazio di memorizzazione isolato Isolamento sconosciuto
Spazio di memorizzazione isolato Quota utente illimitata No
Media Audio, video e immagini sicure
Stampa Stampa predefinita No
Stampa Stampa sicura
Riflessione Emettere No
Sicurezza Esecuzione di codice gestito
Sicurezza Asserzione delle autorizzazioni concesse No
Interfaccia utente Illimitato No
Interfaccia utente Finestre di primo livello sicure
Interfaccia utente Appunti personalizzati
Navigatore Web Navigazione sicura dei frame verso HTML

Nota

Taglia e Incolla è consentito solo in modalità di attendibilità parziale quando avviato dall'utente.

Se è necessario aumentare le autorizzazioni, è necessario modificare le impostazioni del progetto e il manifesto dell'applicazione ClickOnce. Per altre informazioni, vedere "Panoramica delle applicazioni browser XAML WPF". I documenti seguenti possono essere 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, l'utente riceverà la richiesta ClickOnce standard che li informa delle autorizzazioni elevate. L'utente può scegliere di continuare o annullare l'installazione.

In alternativa, puoi usare il modello di distribuzione attendibile ClickOnce per distribuire con fiducia completa da qualsiasi area di sicurezza. Per ulteriori informazioni, vedere Panoramica della distribuzione di applicazioni attendibili e Sicurezza.

Vedere anche