Sdílet prostřednictvím


CA2119: Zapečeťte metody, které vyhovují privátním rozhraním

TypeName

SealMethodsThatSatisfyPrivateInterfaces

CheckId

CA2119

Kategorie

Microsoft.Security

Narušující změna

Narušující

Příčina

Dědičný veřejný typ poskytuje přepisovatelnou implementaci metody rozhraní internal (Friend v jazyce Visual Basic).

Popis pravidla

Metody rozhraní mají veřejný přístup, což nelze změnit implementací typu.Rozhraní internal vytváří ujednání, jehož implementace by neměla být provedena mimo sestavení definující toto rozhraní.Veřejný typ implementující metodu rozhraní internal za použití modifikátoru virtual (Overridable v jazyce Visual Basic) umožňuje, aby byla metoda přepsána odvozeným typem mimo sestavení.Pokud druhý typ v definujícím sestavení volá metodu a očekává ujednání týkající se pouze rozhraní internal, může být chování narušeno, je-li namísto očekávané metody spuštěna metoda mimo sestavení.Takové chování ohrožuje zabezpečení.

Jak vyřešit porušení

Chcete-li opravit porušení tohoto pravidla, zabraňte přepsání metody mimo sestavení použitím jedné z následujících možností:

  • Použijte v deklarujícím typu klíčové slovo sealed (NotInheritable v jazyce Visual Basic).

  • Změňte přístupnost deklarujícího typu na internal (Friend v jazyce Visual Basic).

  • Odstraňte všechny veřejné konstruktory z deklarujícího typu.

  • Implementujte metodu bez použití modifikátoru virtual.

  • Implementujte metodu explicitně.

Kdy potlačit upozornění

Potlačení upozornění tohoto pravidla je bezpečné, pokud po pečlivém zvážení při přepisování metody mimo sestavení neexistují žádné zneužitelné problémy se zabezpečením.

Příklad

Následující příklad ukazuje typ, BaseImplementation, který porušuje toto pravidlo.

Imports System

Namespace SecurityLibrary

   Interface IValidate
      Function UserIsValidated() As Boolean 
   End Interface 

   Public Class BaseImplementation
      Implements IValidate

      Overridable Function UserIsValidated() As Boolean _ 
         Implements IValidate.UserIsValidated
         Return False 
      End Function 

   End Class 

   Public Class UseBaseImplementation

      Sub SecurityDecision(someImplementation As BaseImplementation)

         If(someImplementation.UserIsValidated() = True)
            Console.WriteLine("Account number & balance.")
         Else
            Console.WriteLine("Please login.")
         End If 

      End Sub 

   End Class 

End Namespace
using System;

namespace SecurityLibrary
{
   // Internal by default. 
   interface IValidate
   {
      bool UserIsValidated();
   }

   public class BaseImplementation : IValidate
   {
      public virtual bool UserIsValidated()
      {
         return false;
      }
   }

   public class UseBaseImplementation
   {
      public void SecurityDecision(BaseImplementation someImplementation)
      {
         if(someImplementation.UserIsValidated() == true)
         {
            Console.WriteLine("Account number & balance.");
         }
         else
         {
            Console.WriteLine("Please login.");
         }
      }
   }
}
using namespace System;

namespace SecurityLibrary
{
   // Internal by default. 
   interface class IValidate
   {
      bool UserIsValidated();
   };

   public ref class BaseImplementation : public IValidate
   {
   public:
      virtual bool UserIsValidated()
      {
         return false;
      }
   };

   public ref class UseBaseImplementation
   {
   public:
      void SecurityDecision(BaseImplementation^ someImplementation)
      {
         if(someImplementation->UserIsValidated() == true)
         {
            Console::WriteLine("Account number & balance.");
         }
         else
         {
            Console::WriteLine("Please login.");
         }
      }
   };
}

Následující příklad zneužívá implementaci virtuální metody z předchozího příkladu.

Imports System

Namespace SecurityLibrary

   Public Class BaseImplementation

      Overridable Function UserIsValidated() As Boolean 
         Return False 
      End Function 

   End Class 

   Public Class UseBaseImplementation

      Sub SecurityDecision(someImplementation As BaseImplementation)

         If(someImplementation.UserIsValidated() = True)
            Console.WriteLine("Account number & balance.")
         Else
            Console.WriteLine("Please login.")
         End If 

      End Sub 

   End Class 

End Namespace
using System;

namespace SecurityLibrary
{
    public class BaseImplementation 
    {
        public virtual bool UserIsValidated()
        {
            return false;
        }
    }

    public class UseBaseImplementation
    {
        public void SecurityDecision(BaseImplementation someImplementation)
        {
            if (someImplementation.UserIsValidated() == true)
            {
                Console.WriteLine("Account number & balance.");
            }
            else
            {
                Console.WriteLine("Please login.");
            }
        }
    }
}
using namespace System;

namespace SecurityLibrary
{
   public ref class BaseImplementation
   {
   public:
      virtual bool UserIsValidated()
      {
         return false;
      }
   };

   public ref class UseBaseImplementation
   {
   public:
      void SecurityDecision(BaseImplementation^ someImplementation)
      {
         if(someImplementation->UserIsValidated() == true)
         {
            Console::WriteLine("Account number & balance.");
         }
         else
         {
            Console::WriteLine("Please login.");
         }
      }
   };
}

Viz také

Referenční dokumentace

Rozhraní (Průvodce programováním v C#)

Další zdroje

Rozhraní (Visual Basic)