Sicurezza con attendibilità parziale in WPF
In 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 critiche del sistema. Dal momento che le applicazioni Windows Presentation Foundation (WPF) ospitate dal browser possono essere avviate dal browser, devono essere conformi a una serie di limitazioni dello stesso tipo. Per attivare queste limitazioni, WPF si basa su Code Access Security (CAS) e su ClickOnce (vedere Strategia di sicurezza di WPF - Sicurezza della piattaforma). Per impostazione predefinita, le applicazioni ospitate dal browser richiedono il set di autorizzazioni CAS dell'area Internet, a prescindere 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 come applicazioni in esecuzione con attendibilità parziale.
In WPF viene fornito ampio supporto per garantire l'utilizzo del maggior numero possibile di funzionalità in modo sicuro con attendibilità parziale e, tramite CAS, supporto aggiuntivo per la programmazione con attendibilità parziale.
Di seguito sono elencate le diverse sezioni di questo argomento:
Supporto con attendibilità parziale della funzionalità WPF
Programmazione con attendibilità parziale
Gestione delle autorizzazioni
Supporto con attendibilità parziale della funzionalità WPF
Nella tabella seguente sono elencate le funzionalità di livello elevato di Windows Presentation Foundation (WPF) che è possibile utilizzare in modo sicuro entro i limiti del set di autorizzazioni dell'area Internet.
Tabella 1: Funzionalità WPF sicure in attendibilità parziale
Area funzionalità |
Funzionalità |
---|---|
Generale |
Finestra del browser Accesso al sito di origine IsolatedStorage (limite di 512 KB) Provider UIAutomation Esecuzione di comandi IME (Input Method Editor) Stilo e input penna di Tablet PC Trascinamento della selezione simulato mediante eventi del mouse capture e move OpenFileDialog Deserializzazione XAML (mediante XamlReader.Load) |
Integrazione Web |
Finestra di dialogo di download del browser Esplorazione di primo livello avviata dall'utente mailto:links Parametri URI (Uniform Resource Identifier) HTTPWebRequest Contenuto WPF ospitato in IFRAME Hosting di pagine HTML dello stesso sito utilizzando Frame Hosting di pagine HTML dello stesso sito utilizzando WebBrowser Servizi Web (ASMX) Servizi Web (mediante Windows Communication Foundation) Scripting DOM (Document Object Model) |
Visiva |
2D e 3D Animazione Elementi multimediali (sito di origine e tra domini) Immagini/Audio/Video |
Lettura |
Oggetti FlowDocuments Documenti XPS Tipi di carattere incorporati e di sistema Caratteri CFF e TrueType |
Modifica |
Controllo ortografico RichTextBox Supporto Appunti per testo non crittografato e input penna Operazione Incolla avviata dall'utente Copia di contenuto selezionato |
Controlli |
Controlli generici |
Nella tabella sono incluse le funzionalità WPF di livello elevato. Per informazioni più dettagliate, consultare la documentazione disponibile in Windows Software Development Kit (SDK) sulle autorizzazioni necessarie per ciascun membro di WPF. Inoltre, le seguenti funzionalità contengono informazioni più dettagliate sull'esecuzione in situazioni di attendibilità parziale, con alcune considerazioni speciali.
XAML (vedere Cenni preliminari su XAML (WPF)).
Popup (vedere System.Windows.Controls.Primitives.Popup).
Trascinamento della selezione (vedere Cenni preliminari sul 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 sono elencate le funzionalità WPF che non è possibile utilizzare in modo sicuro entro i limiti del set di autorizzazioni dell'area Internet.
Tabella 2: Funzionalità WPF non sicure in attendibilità parziale
Area funzionalità |
Funzionalità |
---|---|
Generale |
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 |
Visiva |
Effetti bitmap Codifica delle immagini |
Modifica |
Appunti RTF (Rich-Text Format) Supporto XAML completo |
Programmazione con attendibilità parziale
Per 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 si tenta di installare il codice. L'utente potrà scegliere se continuare o annullare l'installazione. Nella tabella che segue viene descritto il comportamento dell'applicazione per ogni area di sicurezza e le azioni necessarie relative all'applicazione per acquisire attendibilità totale.
Area di sicurezza |
Comportamento |
Acquisizione di attendibilità totale |
---|---|---|
Computer locale |
Attendibilità totale automatica |
Nessuna azione necessaria. |
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. In CAS e in WPF vengono fornite varie tecniche per la gestione di uno scenario di questo tipo.
Rilevamento delle autorizzazioni tramite CAS
In alcune situazioni, è possibile che il codice condiviso degli assembly di librerie sia utilizzato dalle applicazioni autonome e dalle XBAPs. 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 consente di rilevare automaticamente se sono disponibili determinate autorizzazioni utilizzando le funzionalità di sicurezza di Microsoft .NET Framework. In modo specifico, è possibile verificare la disponibilità di una determinata autorizzazione chiamando il metodo Demand sull'istanza dell'autorizzazione desiderata. Tale procedura viene mostrata nell'esempio seguente, in cui il codice esegue una query per verificare la disponibilità dell'autorizzazione a salvare un file sul disco locale:
Imports System.IO ' File, FileStream, StreamWriter
Imports System.IO.IsolatedStorage ' IsolatedStorageFile
Imports System.Security ' CodeAccesPermission, IsolatedStorageFileStream
Imports System.Security.Permissions ' FileIOPermission, FileIOPermissionAccess
Imports System.Windows ' MessageBox
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
using System.IO; // File, FileStream, StreamWriter
using System.IO.IsolatedStorage; // IsolatedStorageFile
using System.Security; // CodeAccesPermission, IsolatedStorageFileStream
using System.Security.Permissions; // FileIOPermission, FileIOPermissionAccess
using System.Windows; // MessageBox
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;
}
}
...
}
}
Se un'applicazione non dispone dell'autorizzazione desiderata, la chiamata al metodo Demand genera un'eccezione di sicurezza. In caso contrario, l'autorizzazione è disponibile. IsPermissionGranted incapsula questo comportamento e restituisce true o false a seconda dei casi.
Riduzione normale delle prestazioni della funzionalità
La capacità del codice di rilevare le autorizzazioni di cui dispone risulta particolarmente interessante nel caso in cui 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 memorizzazione 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 desidera 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 riportato di seguito.
Imports System.IO ' File, FileStream, StreamWriter
Imports System.IO.IsolatedStorage ' IsolatedStorageFile
Imports System.Security ' CodeAccesPermission
Imports System.Security.Permissions ' FileIOPermission, FileIOPermissionAccess
Imports System.Windows ' MessageBox
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
using System.IO; // File, FileStream, StreamWriter
using System.IO.IsolatedStorage; // IsolatedStorageFile
using System.Security; // CodeAccesPermission
using System.Security.Permissions; // FileIOPermission, FileIOPermissionAccess
using System.Windows; // MessageBox
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;
}
}
...
}
}
In molte situazioni è possibile trovare un'alternativa all'attendibilità parziale.
In un ambiente controllato, ad esempio una Intranet, è possibile installare framework gestiti personalizzati nella base client in global assembly cache (GAC). Queste librerie possono eseguire codice che richiede attendibilità totale e possono essere oggetto di riferimento da parte di applicazioni alle quali è consentita unicamente l'attendibilità parziale tramite AllowPartiallyTrustedCallersAttribute. Per ulteriori informazioni, vedere Sicurezza (WPF) e Strategia di sicurezza di WPF - Sicurezza della piattaforma.
Rilevamento host del browser
L'utilizzo di CAS per la verifica delle autorizzazioni è una tecnica appropriata se è necessaria una verifica per singola autorizzazione. 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. Al contrario, se l'XAML browser application (XBAP) viene eseguita solo nella sandbox dell'area Internet, è possibile utilizzare la proprietà BrowserInteropHelper.IsBrowserHosted, che restituisce true per le XAML browser applications (XBAPs).
Nota |
---|
La proprietà IsBrowserHosted consente unicamente di stabilire se un'applicazione è eseguita in un browser, non il set di autorizzazioni utilizzato dall'applicazione. |
Gestione delle autorizzazioni
Per impostazione predefinita, le applicazioni XBAPs vengono eseguite con attendibilità parziale (set di autorizzazioni dell'area Internet predefinito). Tuttavia, a seconda dei requisiti dell'applicazione, questo set predefinito può essere modificato. Se, ad esempio, un'applicazione XBAPs viene avviata da una Intranet locale, può usufruire di un set di autorizzazioni più esteso, illustrato nella tabella seguente.
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 |
Aprire |
Sì |
Sì |
Finestre di dialogo file |
Illimitato |
Sì |
No |
Archiviazione isolata |
Isolamento assembly in base all'utente |
Sì |
No |
Archiviazione isolata |
Isolamento sconosciuto |
Sì |
Sì |
Archiviazione isolata |
Quota utenti illimitata |
Sì |
No |
Supporti multimediali |
Audio, video e immagini sicure |
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 |
Illimitato |
Sì |
No |
Interfaccia utente |
Finestre di primo livello sicure |
Sì |
Sì |
Interfaccia utente |
Appunti personali |
Sì |
Sì |
Browser |
Esplorazione 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 ulteriori 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 l'applicazione XBAP in uso richiede l'attendibilità totale, è possibile utilizzare gli stessi strumenti per aumentare le autorizzazioni necessarie. Tuttavia l'attendibilità totale verrà ottenuta solo se un'applicazione XBAP viene installata o avviata dal computer locale, dalla Intranet o da un URL incluso nell'elenco dei 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 utilizzare il modello di distribuzione attendibile di ClickOnce per una distribuzione con attendibilità totale da qualsiasi area di sicurezza. Per ulteriori informazioni, vedere Cenni preliminari sulla distribuzione di applicazioni attendibili e Sicurezza (WPF).