Share via


CA2147: Transparente Methoden dürfen keine Sicherheitsassertionen verwenden.

Element Wert
RuleId CA2147
Category Microsoft.Security
Unterbrechende Änderung Breaking

Ursache

Als SecurityTransparentAttribute markiertem Code werden keine ausreichenden Berechtigungen für Assertionen erteilt.

Hinweis

Diese Regel wurde als veraltet markiert. Weitere Informationen finden Sie unter Veraltete Regeln.

Regelbeschreibung

Mit dieser Regel werden alle Methoden und Typen in einer Assembly analysiert, die entweder zu 100 % aus transparentem Code oder aus einer Kombination aus transparentem und kritischem Code besteht. Anschließend werden alle deklarativen oder imperativen Verwendungen von Assert gekennzeichnet.

Zur Laufzeit führen alle Aufrufe von Assert für transparenten Code dazu, dass eine InvalidOperationException ausgelöst wird. Dies kann sowohl in vollständig transparenten Assemblys als auch in gemischten transparenten/kritischen Assemblys auftreten, bei denen eine Methode oder ein Typ als transparent deklariert ist, aber eine deklarative oder imperative Assertion enthält.

Mit .NET Framework 2.0 wurde ein Feature namens Transparenz eingeführt. Einzelne Methoden, Felder, Schnittstellen, Klassen und Typen können entweder transparent oder kritisch sein.

Transparenter Code darf Sicherheitsberechtigungen nicht erhöhen. Daher werden alle Berechtigungen, die ihm gewährt oder von ihm verlangt werden, automatisch über den Code an den Aufrufer oder die Hostanwendungsdomäne übergeben. Beispiele für Erhöhungen sind Asserts, LinkDemands, SuppressUnmanagedCode und unsafe Code.

Behandeln von Verstößen

Um das Problem zu beheben, markieren Sie entweder den Code, der die Assertion aufruft, mit SecurityCriticalAttribute oder entfernen die Assertion.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Meldungen aus dieser Regel.

Beispiel 1

Dieser Code führt zu Fehlern, wenn SecurityTestClass transparent ist und die Assert-Methode eine InvalidOperationException auslöst.

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();
        }
    }
}

Beispiel 2

Eine Möglichkeit besteht darin, für die SecurityTransparentMethod-Methode im folgenden Beispiel einen Code Review durchzuführen. Wenn die SecurityTransparentMethod-Methode dabei als sicher für Rechteerweiterungen gilt, markieren Sie sie als sicherheitskritisch. Dies setzt eine detaillierte, vollständige und fehlerfreie Sicherheitsüberwachung für die Methode und aller Aufrufe voraus, die innerhalb der Methode in der Assertion auftreten:

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
        }
    }
}

Eine weitere Möglichkeit besteht darin, die Assertion aus dem Code zu entfernen und alle nachfolgenden Anforderungen für Datei-E/A-Berechtigungen über SecurityTransparentMethod hinaus an den Aufrufer weiterzuleiten. Dadurch werden Sicherheitsüberprüfungen aktiviert. In diesem Fall ist keine Sicherheitsüberwachung erforderlich, da die Berechtigungsanforderungen an den Aufrufer und/oder die Anwendungsdomäne weitergeleitet werden. Berechtigungsanforderungen werden streng durch Sicherheitsrichtlinien, Hostingumgebung und Berechtigungszuweisungen für die Codequelle gesteuert.

Weitere Informationen

Sicherheitswarnungen