Partilhar via


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.");
      }
   }
}

Consulte também

Conceitos

Demandas de link

Outros recursos

Diretrizes de codificação segura