Share via


Nozioni fondamentali sulla sicurezza in .NET Framework

La sicurezza per l'accesso al codice è la parte di .NET Framework che controlla l'accesso alle risorse mediante il controllo dell'esecuzione del codice.Si tratta di una funzionalità di sicurezza distinta da, e in aggiunta a, quella fornita dal sistema operativo.

Funzionamento

Quando un utente esegue l'applicazione, viene assegnata a un'area da Common Language Runtime di .NET Framework.Le cinque aree sono le seguenti:

Area

Descrizione

Risorse del computer

Il codice dell'applicazione si trova nel computer dell'utente.

Intranet locale

Il codice dell'applicazione viene eseguito da una condivisione file nell'Intranet dell'utente.

Internet

Il codice dell'applicazione viene eseguito da Internet.

Siti attendibili

Si tratta di applicazioni provenienti da siti definiti "attendibili" tramite Internet Explorer.

Siti con restrizioni

Si tratta di applicazioni provenienti da siti definiti "con restrizioni" tramite Internet Explorer.

L'assegnazione delle prime tre aree, vale a dire Risorse del computer, Intranet locale e Internet, è basata sulla posizione in cui si trova il codice.È possibile eseguire l'override dell'assegnazione mediante l'assegnazione di siti specifici ai gruppi Siti attendibili o Siti con restrizioni in Internet Explorer.

Ognuna di queste aree presenta specifiche autorizzazioni di accesso impostate da un amministratore di sistema.Il livello di sicurezza per un'area può essere impostato su attendibilità totale, attendibilità media, attendibilità bassa o su nessuna attendibilità.I livelli di attendibilità definiscono le risorse a cui può accedere l'applicazione.L'area, insieme alle altre prove di sicurezza, quali l'editore, il nome sicuro, il sito Web e l'URL del codice, determina le autorizzazioni concesse al codice in fase di esecuzione.Per ulteriori informazioni sulle prove di sicurezza, vedere Evidenza. Non si ha alcun controllo sulle impostazioni di sicurezza nel computer dell'utente, tuttavia l'applicazione deve agire all'interno delle impostazioni che rileva durante l'esecuzione.Ciò può significare che all'applicazione verrà negato l'accesso a determinate risorse.Ad esempio, può essere necessario che l'applicazione scriva dati in un file, ma il sistema dell'utente negherà l'accesso in scrittura in fase di esecuzione generando un'eccezione.

Il compito sarà di sviluppare l'applicazione per gestire questa situazione.Questo non significa necessariamente che l'applicazione creata trovi un altro modo per scrivere i dati,ma deve prevedere che non si è in grado di eseguire questa operazione e di rispondere quindi a tale possibilità.Per rendere il codice più affidabile, è possibile utilizzare maggiormente la gestione delle eccezioni o alcuni oggetti nello spazio dei nomi System.Security.Permissions.Una breve descrizione di questi metodi è inclusa in una sezione più avanti in questo articolo: "Sviluppo per ambienti di attendibilità parziale".

I livelli di sicurezza per le aree sono impostati tramite Strumenti di amministrazione installato con .NET Framework.Per ulteriori informazioni sull'impostazione dei livelli di sicurezza per le aree in un computer, vedere Strumenti di amministrazione.

Full Trust

Gli sviluppatori spesso lavorano in un ambiente di attendibilità totale.Mantengono il codice sorgente sul disco rigido ed eseguono il test delle applicazioni dai computer di sviluppo.In questo tipo di ambiente, è possibile eseguire nel computer locale qualsiasi codice compilato dallo sviluppatore.Non vengono generate eccezioni di sicurezza in quanto per impostazione predefinita il computer locale è un ambiente di attendibilità totale.

Attendibilità parziale

L'attendibilità parziale descrive qualsiasi area che non sia di attendibilità totale.Quando un'applicazione viene distribuita, può spostarsi in una nuova area, magari in quella che non concede l'attendibilità totale all'applicazione.I due scenari più comuni in cui il codice viene eseguito in attendibilità parziale sono i seguenti:

  • Esecuzione del codice scaricato da Internet.

  • Esecuzione del codice che si trova in una condivisione di rete (Intranet).

Alcuni esempi di risorse che potrebbero essere negate in un'area di attendibilità parziale sono le seguenti:

  • Operazioni di I/O di file, inclusi lettura, scrittura, creazione, eliminazione o stampa di file.

  • Componenti di sistema, ad esempio valori del Registro di sistema e variabili di ambiente.

  • Componenti server, inclusi servizi di directory, Registro di sistema, log eventi, contatori di prestazioni e code di messaggi.

Specificare le operazioni non consentite in un ambiente di attendiblità parzialenon è semplice.Ogni classe e ogni metodo di ciascuna classe in .NET Framework ha un attributo di sicurezza che definisce il livello di attendibilità necessario per l'esecuzione di quel metodo e non è possibile accedere a tale attributo in fase di esecuzione proprio per queste funzionalità di sicurezza.Il livello dell'area non è un mapping semplice tra il livello di attendibilità e gli attributi, bensì un insieme di determinate autorizzazioni fornite a classi e metodi particolari.L'applicazione non sarà in grado di eseguire semplicemente una query del livello di attendibilità e quindi di prevedere le risorse non disponibili.È possibile determinare se l'applicazione venga eseguita o meno in attendibilità completa.Nella sezione successiva, "Sviluppo per ambienti di attendibilità parziale", verrà illustrato un metodo per eseguire tale operazione.

Sviluppo per ambienti di attendibilità parziale

In questa sezione viene illustrata un'indagine sintetica su come i problemi di sicurezza possono influire sulla scrittura del codice.Non esiste una singola soluzione allo sviluppo per l'ambiente di attendibilità parziale,questa dipenderà dall'applicazione che si sta scrivendo.Inoltre, poiché il livello di attendibilità può cambiare durante l'esecuzione dell'applicazione, non si può semplicemente eseguire il test del livello di attendiblità esistente e quindi procedere.

Codice dell'eccezione di sicurezza

Il primo passaggio nello sviluppo per aree di attendibilità parziale consiste nello scrivere il codice che riconosce che verranno generate eccezioni di sicurezza.Si consideri il codice riportato di seguito.

Public Sub MakeABitmap()
    Dim b As New System.Drawing.Bitmap(100, 100)
    ' Some code here to draw a nice picture in the bitmap
    b.Save("c:\PrettyPicture.bmp")
End Sub
public void MakeABitmap()
{
    System.Drawing.Bitmap b =
        new System.Drawing.Bitmap(100, 100);
    // Some code here to draw a nice picture in the bitmap
    b.Save("c:\\PrettyPicture.bmp");
}

Questo metodo viene eseguito senza generare un'eccezione qualora il progetto e l'assembly del progetto sono memorizzati sul disco rigido del computer e se si è un membro del gruppo Amministratori nel computer.Se si distribuisce questa applicazione nell'Intranet, l'eccezione SecurityException può essere generata quando l'applicazione tenta di salvare l'oggetto bitmap.Se non si ha un blocco Istruzione Try...Catch...Finally (Visual Basic) o try-catch-finally (C# Reference) intorno a questo codice, l'applicazione termina con l'eccezionee non è probabilmente un'esperienza soddisfacente per l'utente.Se si aggiunge un codice di gestione delle eccezioni, l'applicazione può:

  • Avvertire l'utente che l'applicazione non può completare tutte le attività necessarie.

  • Liberare tutti gli oggetti esistenti in modo che il codice eseguito dopo il blocco catch non abbia esito negativo.

È possibile modificare il codice di salvataggio di bitmap come illustrato di seguito.Mediante il codice aggiunto l'utente riceve un avviso sul mancato salvataggio del file dovuto a una negazione di sicurezza e gli errori di sicurezza vengono separati da quelli degli I/O di file, ad esempio i nomi di file non corretti.Questo metodo non crea alcuna vunerabilità nel sistema di sicurezza.L'utente o modificherà la sicurezza per concedere l'attendibilità all'applicazione oppure non eseguirà l'applicazione.

Public Sub MakeABitmap()
    Dim b As System.Drawing.Bitmap = Nothing
    Try
        b = New System.Drawing.Bitmap(100, 100)
        b.Save("c:\PrettyPicture.bmp")
    Catch ex As System.Security.SecurityException
        ' Let the user know the save won't work. 
        MessageBox.Show("Permission to save the file was denied, " & 
               "and the bitmap was not saved.")
    Catch ex As System.Exception
        ' React to other exceptions here.
        MessageBox.Show("Unable to create and save the bitmap.")
    End Try
End Sub
public void MakeABitmap()
{
    System.Drawing.Bitmap b = null;

    try
    {
        b = new System.Drawing.Bitmap(100, 100);
        b.Save("c:\\PrettyPicture.bmp");
    }
    catch (System.Security.SecurityException ex)
    {
        // Let the user know the save won't work. 
        MessageBox.Show("Permission to save the file was denied, " +
            "and the bitmap was not saved.");
    }
    catch (System.Exception ex)
    {
        // React to other exceptions here.
        MessageBox.Show("Unable to create and save the bitmap.");
    }
}

Classi, attributi ed enumerazioni dallo spazio dei nomi System.Security.Permissions supportano un maggiore controllo sulle attività di sicurezza nell'applicazione.Se si stanno scrivendo librerie che possono essere chiamate da altre applicazioni, è probabile che l'utente desideri che la propria libreria verifichi le autorizzazioni del codice chiamante.Si potrebbe, ad esempio, aggiungere semplicemente l'attributo a livello di assembly seguente nella parte superiore del file di codice o al file AssemblyInfo.vb oppure al file AssemblyInfo.cs.Per ulteriori informazioni, vedere Impostazione degli attributi dell'assembly.

<Assembly: System.Security.Permissions.FileIOPermissionAttribute( 
    System.Security.Permissions.SecurityAction.RequestMinimum, 
    Write:="c:\PrettyPicture.bmp")> 
[assembly: System.Security.Permissions.FileIOPermissionAttribute(
    System.Security.Permissions.SecurityAction.RequestMinimum,
    Write = "c:\\PrettyPicture.bmp")]

Il runtime verifica l'autorizzazione durante il caricamento dell'assembly.Se il runtime nega l'autorizzazione richiesta, il caricamento dell'assembly non viene completato e viene generata un'eccezione di sicurezza.Se questo attributo viene aggiunto a un'applicazione autonoma, l'applicazione potrebbe non essere eseguita.Se questo attributo viene visualizzato in una libreria di classi, la libreria potrebbe non essere caricata durante la fase di esecuzione.È necessario aggiungere un blocco al codice che chiama la libreria di classi.

È inoltre possibile richiedere specificamente le autorizzazione dal runtime, come illustrato di seguito mediante il metodo Demand.Il runtime può quindi concedere o negare la richiesta.La richiesta viene negata generando un'eccezione di sicurezza.Si potrebbe riscrivere il codice, come indicato di seguito, richiedendo in modo esplicito l'autorizzazione per scrivere il file bitmap:

Public Sub MakeABitmap()
    Dim b As System.Drawing.Bitmap = Nothing
    Dim filename = "c:\PrettyPicture.bmp"
    Dim permission As New System.Security.Permissions.FileIOPermission( 
        System.Security.Permissions.FileIOPermissionAccess.Write, 
        filename)

    Try
        permission.Demand()
        Try
            b = New System.Drawing.Bitmap(100, 100)
            b.Save(filename)
        Catch ex As System.Exception
            MessageBox.Show("Unable to create and save the bitmap.")
        End Try
    Catch ex As System.Security.SecurityException
        ' Let the user know the save won't work. 
        MessageBox.Show("Permission to save the file was denied, " & 
               "and the bitmap was not saved.")
    Catch ex As System.Exception
        ' React to other exceptions here.
        MessageBox.Show("Other error.")
    End Try
End Sub
public void MakeABitmap()
{
    System.Drawing.Bitmap b = null;
    string filename = "c:\\PrettyPicture.bmp";

    System.Security.Permissions.FileIOPermission permission;
    permission = new System.Security.Permissions.FileIOPermission(
        System.Security.Permissions.FileIOPermissionAccess.Write, filename);

    try
    {
        permission.Demand();
        try
        {
            b = new System.Drawing.Bitmap(100, 100);
            b.Save(filename);
        }
        catch (System.Exception ex)
        {
            MessageBox.Show("Unable to create and save the bitmap.");
        }
    }
    catch (System.Security.SecurityException ex)
    {
        // Let the user know the save won't work. 
        MessageBox.Show("Permission to save the file was denied, " +
               "and the bitmap was not saved.");
    }
    catch (System.Exception ex)
    {
        // React to other exceptions here.
        MessageBox.Show("Other error.");
    }
}

Test

Il secondo passaggio nello sviluppo per aree di attendibilità parziale consiste nell'eseguire il test in ambienti multipli, in particolare dall'Intranet e da Internet.In questo modo verrà forzata la generazione di eccezioni di sicurezza.Un test importante consiste nel creare un account utente nel computer locale che non disponga dei diritti di amministratore e nel provare ad eseguire l'applicazione con tale account.

Vedere anche

Attività

Procedura: eseguire codice parzialmente attendibile in un oggetto sandbox

Procedura: richiedere le autorizzazioni minime tramite il flag RequestMinimum

Concetti

Sicurezza dall'accesso di codice

Linee guida per la generazione di codice sicuro

Modifiche della sicurezza in .NET Framework 4