Share via


CA2147: Il codice Transparent non può utilizzare asserzioni di sicurezza

Articolo Valore
ID regola CA2147
Category Microsoft.Security
Modifica Interruzione

Causa

Codice contrassegnato come SecurityTransparentAttribute non concesso a autorizzazioni sufficienti per l'asserzione.

Nota

Questa regola è stata deprecata. Per altre informazioni, vedere Regole deprecate.

Descrizione regola

Questa regola analizza tutti i metodi e i tipi in un assembly trasparente o misto al 100% e contrassegna qualsiasi utilizzo dichiarativo o imperativo di Assert.

In fase di esecuzione, tutte le chiamate a Assert da codice trasparente genereranno un'eccezione InvalidOperationException . Ciò può verificarsi in assembly trasparenti al 100% e anche in assembly trasparenti/critici misti in cui un metodo o un tipo è dichiarato trasparente, ma include un'asserzione dichiarativa o imperativa.

.NET Framework 2.0 ha introdotto una funzionalità denominata trasparenza. I singoli metodi, campi, interfacce, classi e tipi possono essere trasparenti o critici.

Il codice trasparente non può elevare privilegi di sicurezza. Di conseguenza, tutte le autorizzazioni concesse o richieste vengono passate automaticamente tramite il codice al chiamante o al dominio dell'applicazione host. Esempi di elevazione dei privilegi includono Asserts, LinkDemands, SuppressUnmanagedCode e unsafe codice.

Come correggere le violazioni

Per risolvere il problema, contrassegnare il codice che chiama l'asserzione con SecurityCriticalAttributeo rimuovere l'asserzione.

Quando eliminare gli avvisi

Non eliminare un messaggio da questa regola.

Esempio 1

Questo codice avrà esito negativo se SecurityTestClass è trasparente, quando il Assert metodo genera un'eccezione InvalidOperationException.

using System;
using System.Security;
using System.Security.Permissions;

namespace TransparencyWarningsDemo
{

    public class TransparentMethodsUseSecurityAssertsClass
    {
        // CA2147 violation - transparent code using a security assert declaratively.  This can be fixed by
        // any of:
        //   1. Make DeclarativeAssert critical
        //   2. Make DeclarativeAssert safe critical
        //   3. Remove the assert attribute
        [PermissionSet(SecurityAction.Assert, Unrestricted = true)]
        public void DeclarativeAssert()
        {
        }

        public void ImperativeAssert()
        {
            // CA2147 violation - transparent code using a security assert imperatively.  This can be fixed by
            // any of:
            //   1. Make ImperativeAssert critical
            //   2. Make ImperativeAssert safe critical
            //   3. Remove the assert call
            new PermissionSet(PermissionState.Unrestricted).Assert();
        }
    }
}

Esempio 2

Un'opzione consiste nel codificare la revisione del metodo SecurityTransparentMethod nell'esempio seguente e se il metodo è considerato sicuro per l'elevazione dei privilegi, contrassegnare SecurityTransparentMethod con security critical. Ciò richiede che sia necessario eseguire un controllo di sicurezza dettagliato, completo e senza errori sul metodo insieme a eventuali callout che si verificano all'interno del metodo in Assert:

using System;
using System.Security.Permissions;

namespace SecurityTestClassLibrary
{
    public class SecurityTestClass
    {
        [System.Security.SecurityCritical]
        void SecurityCriticalMethod()
        {
            new FileIOPermission(PermissionState.Unrestricted).Assert();

            // perform I/O operations under Assert
        }
    }
}

Un'altra opzione consiste nel rimuovere l'asserzione dal codice e consentire a qualsiasi richiesta di autorizzazione di I/O di file successiva il flusso oltre SecurityTransparentMethod al chiamante. In questo modo vengono attivati i controlli di sicurezza. In questo caso, non è necessario alcun controllo di sicurezza, perché le richieste di autorizzazione verranno propagate al chiamante e/o al dominio dell'applicazione. Le richieste di autorizzazione sono strettamente controllate tramite i criteri di sicurezza, l'ambiente di hosting e le concessioni di autorizzazioni per l'origine del codice.

Vedi anche

Avvisi di sicurezza