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ż
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla