CA2119: запечатайте методы, соответствующие частным интерфейсам

Свойство Значение
Идентификатор правила CA2119
Заголовок Запечатайте методы, соответствующие частным интерфейсам
Категория Безопасность
Исправление является критическим или не критическим Критическое
Включен по умолчанию в .NET 8 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

См. также