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
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per