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.
XAML (vedere XAML in WPF).
Popup (vedere System.Windows.Controls.Primitives.Popup).
Trascinare e rilasciare (vedere Panoramica del trascinamento della selezione).
Appunti (vedere System.Windows.Clipboard).
Immagini (vedere System.Windows.Controls.Image).
Serializzazione (vedere XamlReader.Load, XamlWriter.Save).
Finestra di dialogo Apri file (vedere Microsoft.Win32.OpenFileDialog).
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 | Sì | No |
Variabili di ambiente | Leggere | Sì | No |
Finestre di dialogo per file | Aperto | Sì | Sì |
Finestre di dialogo dei file | Illimitato | Sì | No |
Spazio di memorizzazione isolato | Isolamento dell'assembly da parte dell'utente | Sì | No |
Spazio di memorizzazione isolato | Isolamento sconosciuto | Sì | Sì |
Spazio di memorizzazione isolato | Quota utente illimitata | Sì | No |
Media | Audio, video e immagini sicure | Sì | Sì |
Stampa | Stampa predefinita | Sì | No |
Stampa | Stampa sicura | Sì | Sì |
Riflessione | Emettere | Sì | No |
Sicurezza | Esecuzione di codice gestito | Sì | Sì |
Sicurezza | Asserzione delle autorizzazioni concesse | Sì | No |
Interfaccia utente | Illimitato | Sì | No |
Interfaccia utente | Finestre di primo livello sicure | Sì | Sì |
Interfaccia utente | Appunti personalizzati | Sì | Sì |
Navigatore Web | Navigazione sicura dei frame verso HTML | Sì | Sì |
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"
Mage.exe (strumento per la generazione e modifica dei manifest).
MageUI.exe (Strumento di generazione e modifica dei manifesti, client grafico).
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
.NET Desktop feedback