Udostępnij za pośrednictwem


CA2119: Zapieczętuj metody, które spełniają interfejsy prywatne

TypeName

SealMethodsThatSatisfyPrivateInterfaces

CheckId

CA2119

Kategoria

Microsoft.Security

Zmiana kluczowa

Kluczowa

Przyczyna

Dziedziczny typ publiczny zapewnia implementację metody, którą można zastąpić, interfejsu internal (Friend w języku Visual Basic).

Opis reguły

Metody interfejsu są dostępne publicznie i nie można tego zmienić za pomocą typu implementującego.Interfejs wewnętrzny tworzy kontrakt, który nie jest przeznaczony do implementacji poza zestawem, który definiuje interfejs.Typ publiczny, który implementuje metodę interfejsu wewnętrznego przy użyciu modyfikatora virtual (Overridable w języku Visual Basic), umożliwia zastąpienie metody przez typ pochodny spoza zestawu.Jeśli drugi typ w definiującym zestawie wywołuje metodę i oczekuje kontraktu jedynie wewnętrznego, zachowanie może być zagrożone, gdy zamiast tego zostanie wykonana metoda w zewnętrznym zestawie.Tworzy to lukę w zabezpieczeniach.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, należy zapobiec zastąpieniu metody poza zestawem, za pomocą jednej z następujących czynności:

  • Utwórz typ deklarujący sealed (NotInheritable w języku Visual Basic).

  • Zmień dostępność typu deklarującego na internal (Friend w języku Visual Basic).

  • Usuń wszystkie publiczne konstruktory z typu deklarującego.

  • Zaimplementuj metodę nie wykorzystując modyfikatora virtual.

  • Zaimplementuj metodę jawnie.

Kiedy pominąć ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie dotyczące tej reguły, jeśli po uważnym sprawdzeniu, nie zostaną wykryte żadne problemy z zabezpieczeniami, które mogą zostać wykorzystane, jeśli metoda zostanie zastąpiona poza zestawem.

Przykład

Poniższy przykład pokazuje typ BaseImplementation, który narusza tę regułę.

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

Poniższy przykład wykorzystuje implementację metody z użyciem modyfikatora virtual z poprzedniego przykładu.

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

Zobacz też

Informacje

Interfejsy (Przewodnik programowania w języku C#)

Inne zasoby

Interfejsy (Visual Studio)