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#)