CA2140: Jawny kod nie może odwoływać się do elementów krytycznych dla zabezpieczeń
TypeName |
TransparentMethodsMustNotReferenceCriticalCode |
CheckId |
CA2140 |
Kategoria |
Microsoft.Security |
Zmiana kluczowa |
Kluczowa |
Przyczyna
Metoda przezroczysta:
obsługuje krytyczny pod względem zabezpieczeń typ wyjątku zabezpieczeń
ma parametr oznaczony jako typ krytyczny pod względem zabezpieczeń
posiada parametr generyczny z ograniczeniami krytycznymi pod względem zabezpieczeń
ma zmienną lokalną typu krytycznego pod względem zabezpieczeń
odwołuje się do typu, który jest oznaczony jako krytyczny pod względem zabezpieczeń
wywołuje metodę, która jest oznaczona jako krytyczna pod względem zabezpieczeń
odwołuje się do pola, które jest oznaczone jako krytyczne pod względem zabezpieczeń
zwraca typ, który jest oznaczony jako krytyczny pod względem zabezpieczeń
Opis reguły
Element kodu, oznaczony atrybutem SecurityCriticalAttribute jest krytyczny pod względem zabezpieczeń.Przezroczysta metoda nie może użyć elementu krytycznego pod względem zabezpieczeńJeśli typ przezroczysty próbuje użyć typu krytycznego pod względem zabezpieczeń, jest wyrzucany wyjątek TypeAccessException, MethodAccessException , lub FieldAccessException.
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, wykonaj jedną z następujących czynności:
Oznacz element kodu, który używa kodu krytycznego pod względem zabezpieczeń atrybutem SecurityCriticalAttribute.
- lub -
Usuń atrybut SecurityCriticalAttribute z elementów kodu, które są oznaczone jako krytyczne pod względem zabezpieczeń i oznacz je atrybutem SecuritySafeCriticalAttribute lub SecurityTransparentAttribute.
Kiedy pominąć ostrzeżenia
Nie należy pomijać ostrzeżenia dotyczącego tej reguły.
Przykład
W poniższych przykładach przezroczysta metoda próbuje odwołać się do krytycznej pod względem zabezpieczeń kolekcji generycznej, krytycznego pod względem zabezpieczeń pola i krytycznej pod względem zabezpieczeń metody.
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();
}
}
}