CA2119: запечатайте методы, соответствующие частным интерфейсам
Свойство | Значение |
---|---|
Идентификатор правила | CA2119 |
Заголовок | Запечатайте методы, соответствующие частным интерфейсам |
Категория | Безопасность |
Исправление является критическим или не критическим | Критическое |
Включен по умолчанию в .NET 9 | No |
Причина
Наследуемый открытый тип предоставляет реализацию переопределяемого метода интерфейса internal
(Friend
в Visual Basic).
Описание правила
Методы интерфейса имеют общую доступность, которую не может изменить реализующий тип. Внутренний интерфейс создает контракт, который не предназначен для реализации вне сборки, определяющей интерфейс. Открытый тип, реализующий метод внутреннего интерфейса с помощью модификатора virtual
(Overridable
в Visual Basic), позволяет переопределять метод производным типом, который находится вне сборки. Если второй тип в определяющей сборке вызывает метод и ожидает только внутренний контракт, поведение может быть скомпрометировано, если вместо этого выполняется переопределенный метод во внешней сборке. В этом случает создается уязвимость в системе безопасности.
Устранение нарушений
Для устранения нарушения данного правила следует исключить возможность переопределения метода за пределами сборки с помощью одного из следующих действий.
Создайте объявляющий тип
sealed
(NotInheritable
в Visual Basic).Измените уровень доступности объявляющего типа на
internal
(Friend
в Visual Basic).Удалите все открытые конструкторы из объявляющего типа.
Реализуйте метод без использования модификатора
virtual
.Реализуйте метод явным образом.
Когда лучше отключить предупреждения
Вывод предупреждения для этого правила можно отключить, если после тщательной проверки не будут найдены проблемы безопасности, которые могут возникнуть при переопределении метода вне сборки.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA2119
// The code that's violating the rule is on this line.
#pragma warning restore CA2119
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA2119.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Пример 1
В следующем примере показан тип BaseImplementation
, нарушающий правило.
// 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.");
}
}
}
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) Then
Console.WriteLine("Account number & balance.")
Else
Console.WriteLine("Please login.")
End If
End Sub
End Class
Пример 2
В следующем примере применяется реализация виртуального метода из предыдущего примера.
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.");
}
}
}
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) Then
Console.WriteLine("Account number & balance.")
Else
Console.WriteLine("Please login.")
End If
End Sub
End Class