值
规则 ID
CA2109
类别
安全性
修复是中断修复还是非中断修复
重大
原因
检测到公共事件处理方法或受保护事件处理方法。
规则说明
外部可见的事件处理方法显示了一个安全问题,需要进行检查。
除非绝对必要,否则不要公开事件处理方法。 只要处理程序和事件签名匹配,就可以将调用公开方法的事件处理程序(委托类型)添加到任何事件中。 事件可能由任何代码引发,并且经常由高度可信的系统代码引发,以响应用户操作(例如单击某个按钮)。 向事件处理方法添加安全检查不会阻止代码注册调用方法的事件处理程序。
需求无法可靠地保护由事件处理程序调用的方法。 安全需求通过检查调用堆栈上的调用方,帮助防止代码受到不可信任的调用方利用。 事件处理程序的方法运行时,将事件处理程序添加到事件的代码不一定会出现在调用堆栈上。 因此,在调用事件处理程序方法时,调用堆栈可能仅具有高度受信任的调用方。 这会使事件处理程序方法提出的需求成功。 此外,调用方法时,可能会断言所需的权限。 由于这些原因,只有在检查事件处理方法后才能评估不解决此规则冲突的风险。 检查代码时,请考虑以下问题:
你的事件处理程序是否执行任何危险或可利用的操作,如断言权限或禁止非托管代码权限?
由于代码可随时仅通过堆栈上高度受信任的调用方运行,因此与代码之间有何安全威胁?
如何解决冲突
若要解决此规则的冲突,请检查方法并评估以下各项:
是否可以将事件处理方法设为非公开?
是否可以将所有危险功能移出事件处理程序?
如果提出了安全需求,是否可以通过其他方式实现?
何时禁止显示警告
仅在仔细检查安全性以确保你的代码不会构成安全威胁之后,才能禁止显示此规则的警告。
示例
下面的代码演示了一种可能被恶意代码滥用的事件处理方法。
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.");
}
}
另请参阅
System.Security.CodeAccessPermission.Demand
System.EventArgs
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。