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.
XAML (vedere XAML in WPF).
Popup (vedere System.Windows.Controls.Primitives.Popup).
Trascinamento della selezione (vedere Cenni preliminari sul trascinamento della selezione).
Appunti (vedere System.Windows.Clipboard).
Imaging (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 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
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 è 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
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).
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
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).
Tabella 3: Autorizzazioni LocalIntranet e Internet
Autorizzazione | Attributo | LocalIntranet | Internet |
---|---|---|---|
DNS | Accesso ai server DNS | Sì | No |
Variabili di ambiente | Lettura | Sì | No |
Finestre di dialogo file | Si apra | Sì | Sì |
Finestre di dialogo file | Senza restrizioni | Sì | No |
Spazio di memorizzazione isolato | Isolamento assembly in base all'utente | Sì | No |
Spazio di memorizzazione isolato | Isolamento sconosciuto | Sì | Sì |
Spazio di memorizzazione isolato | Quota utenti illimitata | Sì | No |
File media | Audio, video e immagini sicuri | Sì | Sì |
Stampa | Stampa predefinita | Sì | No |
Stampa | Stampa sicura | Sì | Sì |
Reflection | Emissione | Sì | No |
Sicurezza | Esecuzione del codice gestito | Sì | Sì |
Sicurezza | Asserzione autorizzazioni concesse | Sì | No |
Interfaccia utente | Senza restrizioni | Sì | No |
Interfaccia utente | Finestre di primo livello sicure | Sì | Sì |
Interfaccia utente | Appunti personali | Sì | Sì |
Web browser | Navigazione sicura dei frame in HTML | Sì | Sì |
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.
Mage.exe (Strumento per la generazione e la modifica di manifesti).
MageUI.exe (Strumento per la generazione e la modifica di 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, 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
.NET Desktop feedback