CA2147: Il codice Transparent non può utilizzare asserzioni di sicurezza
TypeName |
SecurityTransparentCodeShouldNotAssert |
CheckId |
CA2147 |
Category |
Microsoft.Security |
Breaking Change |
Breaking |
Causa
Al codice contrassegnato come SecurityTransparentAttribute non sono concesse autorizzazioni sufficienti per l'asserzione.
Descrizione della regola
Questa regola analizza tutti i metodi e i tipi in un assembly interamente Security Transparent o una combinazione di Security Transparent e Security Critical e contrassegna l'utilizzo dichiarativo o imperativo di Assert.
In fase di esecuzione, qualsiasi chiamata a Assert da codice Security Transparent causerà la generazione di un'eccezione InvalidOperationException.Tale situazione può verificarsi sia negli assembly interamente Security Transparent sia negli assembly che sono una combinazione di Security Transparent e Security Critical in cui un metodo o un tipo è dichiarato trasparente, ma include un'asserzione dichiarativa o imperativa.
Con .NET Framework 2.0 è stata introdotta una funzionalità denominata trasparenza.I singoli metodi, campi, interfacce, classi e tipi possono essere o trasparenti o critici.
Il codice trasparente non ha accesso a privilegi di sicurezza avanzati.Pertanto, qualsiasi autorizzazione venga concessa o richiesta tramite tale codice viene automaticamente passata attraverso il codice al chiamante o al dominio dell'applicazione host.Sono esempi di possibili elevazioni le asserzioni, le pretese LinkDemand, l'attributo SuppressUnmanagedCode e il codice unsafe.
Come correggere le violazioni
Per risolvere il problema, contrassegnare il codice che chiama l'asserzione con SecurityCriticalAttribute o rimuovere l'asserzione.
Esclusione di avvisi
Non sopprimere un messaggio da questa regola.
Esempio
Il codice non verrà eseguito correttamente se SecurityTestClass è trasparente, quando il metodo Assert genera una 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();
}
}
}
Nell'esempio riportato di seguito, un'opzione consiste nel rivedere il codice del metodo SecurityTransparentMethod e se il metodo è considerato sicuro per l'elevazione, contrassegnare SecurityTransparentMethod come critico per la sicurezza. Ciò richiede che un controllo di sicurezza, senza errori, completo e dettagliato venga eseguito sul metodo insieme a qualsiasi callout che si verifica all'interno del metodo sotto l'asserzione:
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 lasciare che le richieste di autorizzazione di I/O del file successive vengano passate da SecurityTransparentMethod al chiamante.Abilita i controlli di sicurezza.In genere, in questi casi non è necessario alcun controllo di sicurezza, poiché le richieste di autorizzazione passeranno al chiamante e/o al dominio dell'applicazione.Le richieste di autorizzazione sono controllate rigorosamente tramite la concessione di autorizzazioni relative ai criteri di sicurezza, all'ambiente host e al codice sorgente.