Udostępnij za pośrednictwem


CA2147: Jawne metody nie mogą używać potwierdzeń zabezpieczeń

Pozycja Wartość
Ruleid CA2147
Kategoria Microsoft.Security
Zmiana powodująca niezgodność Kluczowa

Przyczyna

Kod oznaczony jako SecurityTransparentAttribute nie ma wystarczających uprawnień do potwierdzenia.

Uwaga

Ta reguła została przestarzała. Aby uzyskać więcej informacji, zobacz Przestarzałe reguły.

Opis reguły

Ta reguła analizuje wszystkie metody i typy w zestawie, który jest w 100% przezroczysty lub mieszany przezroczysty/krytyczny, i flaguje wszelkie deklaratywne lub imperatywne użycie elementu Assert.

W czasie wykonywania wszystkie wywołania Assert z przezroczystego kodu spowodują zgłoszenie.InvalidOperationException Może to wystąpić zarówno w 100% przezroczystych zestawach, jak i w mieszanych zestawach przezroczystych/krytycznych, w których metoda lub typ jest zadeklarowana jako przezroczysta, ale zawiera deklaratywną lub imperatywne asercji.

Program .NET Framework 2.0 wprowadził funkcję o nazwie przezroczystość. Poszczególne metody, pola, interfejsy, klasy i typy mogą być przezroczyste lub krytyczne.

Przezroczysty kod nie może podnieść uprawnień zabezpieczeń. W związku z tym wszelkie uprawnienia przyznane lub żądane są automatycznie przekazywane za pośrednictwem kodu do domeny wywołującej lub aplikacji hosta. Przykłady podniesienia uprawnień obejmują asertywne, LinkDemands, SuppressUnmanagedCode i unsafe kod.

Jak naprawić naruszenia

Aby rozwiązać ten problem, oznacz kod, który wywołuje asercję za pomocą SecurityCriticalAttributeelementu , lub usuń asercję.

Kiedy pomijać ostrzeżenia

Nie pomijaj komunikatu z tej reguły.

Przykład 1

Ten kod zakończy się niepowodzeniem, jeśli SecurityTestClass jest przezroczysty, gdy Assert metoda zgłasza błąd 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();
        }
    }
}

Przykład 2

Jedną z opcji jest przejrzenie metody SecurityTransparentMethod w poniższym przykładzie, a jeśli metoda jest uważana za bezpieczną pod kątem podniesienia uprawnień, oznacz wartość SecurityTransparentMethod z krytycznym zabezpieczeniami. Wymaga to wykonania szczegółowej, kompletnej i bez błędów inspekcji zabezpieczeń w metodzie wraz z wszelkimi wywołaniami występującymi w metodzie w ramach potwierdzenia:

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

Inną opcją jest usunięcie potwierdzenia z kodu i zezwolenie na przepływ wszelkich kolejnych żądań uprawnień we/wy pliku poza securityTransparentMethod do obiektu wywołującego. Umożliwia to sprawdzanie zabezpieczeń. W takim przypadku nie jest wymagana inspekcja zabezpieczeń, ponieważ wymagania dotyczące uprawnień będą przepływać do wywołującego i/lub domeny aplikacji. Wymagania dotyczące uprawnień są ściśle kontrolowane za pośrednictwem zasad zabezpieczeń, środowiska hostingu i dotacji uprawnień źródła kodu.

Zobacz też

Ostrzeżenia dotyczące zabezpieczeń