CA2109:检查可见的事件处理程序

属性
规则 ID CA2109
标题 检查可见的事件处理程序
类别 安全性
修复是中断修复还是非中断修复 重大
在 .NET 9 中默认启用

原因

检测到公共事件处理方法或受保护事件处理方法。

注意

此规则已被弃用。 它上次随 Microsoft.CodeAnalysis.NetAnalyzers 7.0.0 NuGet 包和 .NET 7 SDK 一起提供。

该规则已被删除,因为分析器警告的威胁(不受信任的中介将特权事件处理程序挂接到特权事件调用程序)自 .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.");
    }
}

另请参阅