CA2140: Transparenter Code darf nicht auf sicherheitskritische Elemente verweisen
TypeName |
TransparentMethodsMustNotReferenceCriticalCode |
CheckId |
CA2140 |
Kategorie |
Microsoft.Security |
Unterbrechende Änderung |
Breaking |
Ursache
Eine transparente Methode:
behandelt einen sicherheitskritischen Sicherheitsausnahmetyp
verfügt über einen Parameter, der als sicherheitskritischer Typ markiert ist
hat einen generischen Parameter mit sicherheitskritischen Einschränkungen
verfügt über eine lokale Variable von einem sicherheitskritischen Typ
verweist auf einen Typ, der als sicherheitskritisch markiert ist
ruft eine Methode auf, die als sicherheitskritisch markiert ist
verweist auf ein Feld, das als sicherheitskritisch markiert ist
Gibt einen Typ zurück, der als sicherheitskritisch markiert ist
Regelbeschreibung
Ein Code-Element, das mit dem SecurityCriticalAttribute-Attribut markiert ist, ist sicherheitsrelevant. Eine transparente Methode kann kein sicherheitskritisches Element verwenden. Wenn ein transparenter Typ einen sicherheitskritischen Typ verwendet, wird TypeAccessException, MethodAccessException oder FieldAccessException ausgelöst.
Behandeln von Verstößen
Führen Sie einen der folgenden Schritte aus, um einen Verstoß gegen diese Regel zu beheben:
Das Code-Element markieren, das den sicherheitskritischen Code mit dem SecurityCriticalAttribute-Attribut verwendet.
- oder -
Entfernen Sie das SecurityCriticalAttribute-Attribut aus den Codeelementen, die als sicherheitskritisch markiert werden, und markieren Sie sie stattdessen mit dem SecuritySafeCriticalAttribute-Attribut oder SecurityTransparentAttribute-Attribut.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Warnung dieser Regel.
Beispiel
In den folgenden Beispielen versucht eine transparente Methode, auf eine sicherheitskritische generische Auflistung, ein sicherheitskritisches Feld und eine sicherheitskritische Methode zu verweisen.
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();
}
}
}