CA2123: as demandas de link de substituição devem ser idênticas à base
TypeName |
OverrideLinkDemandsShouldBeIdenticalToBase |
CheckId |
CA2123 |
Categoria |
Microsoft.Security |
Alteração Significativa |
Quebra |
Causa
Um público ou um método protegido em um tipo substituem um método público ou implementam uma interface, e não tenham o mesmo Demandas de link que a interface ou o método virtual.
Descrição da Regra
Esta regra um método corresponde ao método de base, que é uma interface ou um método virtual em outro tipo, e então compara as demandas de link em cada um.Uma violação será informada se o método ou o método de base têm uma procura de link e outros não.
Se essa regra é violada, um chamador mal-intencionado pode ignorar a procura de link simplesmente chamando o método não seguro.
Como Corrigir Violações
Para corrigir uma violação desta regra, aplique a mesma procura de link para o método ou para a implementação de overide.Se isso não for possível, marcar o método com uma procura completa ou remover completamente o atributo.
Quando Suprimir Alertas
Não elimine um alerta desta regra.
Exemplo
O exemplo a seguir mostra mais violações desta regra.
using System.Security;
using System.Security.Permissions;
using System;
namespace SecurityRulesLibrary
{
public interface ITestOverrides
{
[EnvironmentPermissionAttribute(SecurityAction.LinkDemand, Unrestricted=true)]
Object GetFormat(Type formatType);
}
public class OverridesAndSecurity : ITestOverrides
{
// Rule violation: The interface has security, and this implementation does not.
object ITestOverrides.GetFormat(Type formatType)
{
return (formatType == typeof(OverridesAndSecurity) ? this : null);
}
// These two methods are overridden by DerivedClass and DoublyDerivedClass.
[EnvironmentPermissionAttribute(SecurityAction.LinkDemand, Unrestricted=true)]
public virtual void DoSomething()
{
Console.WriteLine("Doing something.");
}
public virtual void DoSomethingElse()
{
Console.WriteLine("Doing some other thing.");
}
}
public class DerivedClass : OverridesAndSecurity, ITestOverrides
{
// Rule violation: The interface has security, and this implementation does not.
public object GetFormat(Type formatType)
{
return (formatType == typeof(OverridesAndSecurity) ? this : null);
}
// Rule violation: This does not have security, but the base class version does.
public override void DoSomething()
{
Console.WriteLine("Doing some derived thing.");
}
// Rule violation: This has security, but the base class version does not.
[EnvironmentPermissionAttribute(SecurityAction.LinkDemand, Unrestricted=true)]
public override void DoSomethingElse()
{
Console.WriteLine("Doing some other derived thing.");
}
}
public class DoublyDerivedClass : DerivedClass
{
// The OverridesAndSecurity version of this method does not have security.
// Base class DerivedClass's version does.
// The DoublyDerivedClass version does not violate the rule, but the
// DerivedClass version does violate the rule.
public override void DoSomethingElse()
{
Console.WriteLine("Doing some other derived thing.");
}
}
}