CA2109: проверьте видимые обработчики событий

Свойство Значение
Идентификатор правила CA2109
Заголовок Проверьте видимые обработчики событий
Категория Безопасность
Исправление является критическим или не критическим Критическое
Включен по умолчанию в .NET 8 No

Причина

Обнаружен открытый или защищенный метод обработки событий.

Примечание.

Это правило устарело. Последний раз он поставляется с пакетом NuGet Microsoft.CodeAnalysis.NetAnalyzers 7.0.0 и пакетом SDK для .NET 7.

Правило было удалено, так как угроза, о которой предупредил анализатор (ненадежный посредник, перехватывая обработчик привилегированных событий вызову привилегированного события) не существовал с момента платформа .NET Framework 4.5.

Описание правила

Видимый извне метод обработки событий представляет собой проблему безопасности, требующую проверки.

Не предоставляйте методы обработки событий, если это не является безусловной необходимостью. Обработчик событий, тип делегата, который вызывает предоставленный метод, может быть добавлен к любому событию, если сигнатуры обработчика и события совпадают. События могут быть вызваны любым кодом. Часто они вызываются системным кодом с высоким уровнем доверия в ответ на действия пользователя, такие как нажатие кнопки. Добавление проверки безопасности в метод обработки событий не мешает коду регистрировать обработчик событий, который вызывает метод.

Требование не может надежно защитить метод, вызываемый обработчиком событий. Требования безопасности помогают защитить код от недоверенного вызывающего объекта путем проверки вызывающих объектов в стеке вызовов. Код, добавляющий в событие обработчик событий, необязательно присутствует в стеке вызовов при запуске методов обработчика событий. Следовательно, при вызове метода обработчика событий стек вызовов может иметь только вызывающие объекты с высоким уровнем доверия. Это приводит к успешному выполнению требований, сделанных методом обработчика событий. Кроме того, запрошенное разрешение может быть утверждено при вызове метода. По этим причинам риск того, что нарушение этого правила не будет устранено, можно оценить только после изучения метода обработки событий. При проверке своего кода необходимо учитывать следующее.

  • Выполняет ли ваш обработчик событий какие-либо операции, которые могут быть опасными или подверженными злонамеренному использованию, например утверждение разрешений или отмена разрешения неуправляемого кода?

  • Какие угрозы безопасности несет в себе ваш код, если он может запускаться в любое время только вызывающими объектами с высоким уровнем доверия в стеке?

Устранение нарушений

Чтобы устранить нарушение этого правила, проверьте метод и оцените следующие аспекты.

  • Можно ли сделать этот метод обработки событий закрытым?

  • Можете ли вы убрать все опасные функции из обработчика событий?

  • Если накладывается требование безопасности, можно ли это сделать каким-либо другим способом?

Когда лучше отключить предупреждения

Отключайте предупреждение из этого правила только после тщательной проверки безопасности, которая показывает, что ваш код не представляет угрозы безопасности.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#pragma warning disable CA2109
// The code that's violating the rule is on this line.
#pragma warning restore CA2109

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

[*.{cs,vb}]
dotnet_diagnostic.CA2109.severity = none

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

Пример

В следующем коде показан метод обработки событий, который может быть использован вредоносным кодом.

public class HandleEvents
{
    // Due to the access level and signature, a malicious caller could 
    // add this method to system-triggered events where all code in the call
    // stack has the demanded permission.

    // Also, the demand might be canceled by an asserted permission.

    [SecurityPermissionAttribute(SecurityAction.Demand, UnmanagedCode = true)]

    // Violates rule: ReviewVisibleEventHandlers.
    public static void SomeActionHappened(Object sender, EventArgs e)
    {
        Console.WriteLine("Do something dangerous from unmanaged code.");
    }
}

См. также