Udostępnij za pośrednictwem


CA2147: Przezroczyste metody nie mogą używać zabezpieczeń potwierdza

TypeName

SecurityTransparentCodeShouldNotAssert

CheckId

CA2147

Kategoria

Microsoft.Security

Zmiana kluczowa

Kluczowa

Przyczyna

Kod, który jest oznaczony jako SecurityTransparentAttribute, nie ma przyznanego wystarczającego uprawnienia do potwierdzenia.

Opis reguły

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

W czasie wykonywania wszelkie wywołania do Assert z przejrzystego kodu spowoduje, że InvalidOperationException zostanie wygenerowany.Może to występować zarówno w zestawach w 100% przezroczystych, a także w zestawach mieszanych przezroczysto-krytycznych, gdzie metoda lub typ jest zadeklarowany jako przezroczysty, ale obejmuje deklaracyjny lub imperatywny Assert.

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

Przezroczysty kod nie może podnosić uprawnień zabezpieczeń.Dlatego wszystkie uprawnienia przyznane lub zażądane przez niego są automatycznie przekazywane poprzez kod do wywołującego lub hosta domeny aplikacji.Przykłady podniesienia włączają metody Asserts, LinkDemands, SuppressUnmanagedCode, i kod unsafe.

Jak naprawić naruszenia

Aby rozwiązać ten problem albo oznacz kod, który wywołuje metodę Assert przez SecurityCriticalAttribute, albo usuń Assert.

Kiedy pominąć ostrzeżenia

Nie należy pomijać komunikatu dotyczącego tej reguły.

Przykład

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

Przegląd kodu metody SecurityTransparentMethod w poniższym przykładzie jest jedną z opcji i jeśli metoda jest uważane za bezpieczną dla podniesienia uprawnień, zaznacz SecurityTransparentMethod przez bezpieczne-krytyczne. Wymaga to szczegółowej, kompletne i bezbłędnej inspekcji zabezpieczeń wykonanej na metodzie oraz wszelkich wywołań występujących w metodzie pod 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
        }
    }
}

Inną opcją jest usunięcie Assert z kodu i zezwolenie kolejnym żądaniom uprawnień pliku We/Wy na przepływ pomiędzy SecurityTransparentMethod i wywołującego.Umożliwia to sprawdzanie zabezpieczeń.W tym przypadku, inspekcji zabezpieczeń nie jest ogólnie potrzebne, ponieważ żądania uprawnień będą przepływać do wywołującego i/lub domeny aplikacji.Żądania uprawnień są ściśle kontrolowane przez zasady zabezpieczeń, środowisko hostingowe i przyznania źródła kodu.

Zobacz też

Inne zasoby

Ostrzeżenia dotyczące zabezpieczeń