CA2140: Il codice Transparent non deve far riferimento a elementi SecurityCritical
TypeName |
TransparentMethodsMustNotReferenceCriticalCode |
CheckId |
CA2140 |
Category |
Microsoft.Security |
Breaking Change |
Breaking |
Causa
Un metodo Trasparent:
gestisce un tipo di eccezione di sicurezza SecurityCritical
dispone di un parametro contrassegnato come un tipo SecurityCritical
dispone di un parametro generico con vincoli SecurityCritical
dispone di una variabile locale di un tipo SecurityCritical
fa riferimento a un tipo contrassegnato come SecurityCritical
chiama un metodo contrassegnato come SecurityCritical
fa riferimento a un campo contrassegnato come un tipo SecurityCritical
restituisce un tipo contrassegnato come SecurityCritical
Descrizione della regola
Un elemento di codice contrassegnato con l'attributo SecurityCriticalAttribute è SecurityCritical. Un metodo trasparente non può utilizzare un elemento critico per la sicurezza. Se il tipo trasparente tenta di utilizzare un tipo SecurityCritical viene generato TypeAccessException, MethodAccessException o FieldAccessException.
Come correggere le violazioni
Per correggere una violazione di questa regola, eseguire una delle seguenti azioni:
Contrassegnare l'elemento di codice che utilizza il codice SecurityCritical con l'attributo SecurityCriticalAttribute
In alternativa
Rimuovere l'attributo SecurityCriticalAttribute dagli elementi di codice contrassegnati come SecurityCritical e invece contrassegnarli con l'attributo SecuritySafeCriticalAttribute o SecurityTransparentAttribute.
Esclusione di avvisi
Non escludere un avviso da questa regola.
Esempio
Negli esempi seguenti, un metodo trasparente tenta di fare riferimento a un insieme generico, un campo e un metodo SecurityCritical.
using System;
using System.Security;
using System.Collections.Generic;
namespace TransparencyWarningsDemo
{
[SecurityCritical]
public class SecurityCriticalClass { }
public class TransparentMethodsReferenceCriticalCodeClass
{
[SecurityCritical]
private object m_criticalField;
[SecurityCritical]
private void CriticalMethod() { }
public void TransparentMethod()
{
// CA2140 violation - transparent method accessing a critical type. This can be fixed by any of:
// 1. Make TransparentMethod critical
// 2. Make TransparentMethod safe critical
// 3. Make CriticalClass safe critical
// 4. Make CriticalClass transparent
List<SecurityCriticalClass> l = new List<SecurityCriticalClass>();
// CA2140 violation - transparent method accessing a critical field. This can be fixed by any of:
// 1. Make TransparentMethod critical
// 2. Make TransparentMethod safe critical
// 3. Make m_criticalField safe critical
// 4. Make m_criticalField transparent
m_criticalField = l;
// CA2140 violation - transparent method accessing a critical method. This can be fixed by any of:
// 1. Make TransparentMethod critical
// 2. Make TransparentMethod safe critical
// 3. Make CriticalMethod safe critical
// 4. Make CriticalMethod transparent
CriticalMethod();
}
}
}