Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA2119 |
| Заголовок | Закройте методы, соответствующие приватным интерфейсам |
| Категория | Безопасность |
| Исправление является критическим или не критическим | Срочное |
| Включен по умолчанию в .NET 10 | Нет |
| Применимые языки | C# и Visual Basic |
Причина
Унаследуемый открытый тип предоставляет реализацию переопределяемого метода интерфейса 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