前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CA2119:密封满足私有接口的方法

CA2119:密封满足私有接口的方法

作者头像
用户4268038
发布2022-02-20 19:44:50
2920
发布2022-02-20 19:44:50
举报
文章被收录于专栏:stcnbstcnb

规则 ID

CA2119

类别

安全性

修复是中断修复还是非中断修复

重大

原因

可继承的公共类型为 internal(在 Visual Basic 中为 Friend)接口提供可重写的方法实现。

规则说明

接口方法具有公共可访问性,实现类型不能对其进行更改。 internal 接口创建一个协定,该协定不应在定义接口的程序集的外部实现。 使用 virtual(在 Visual Basic 中为 Overridable)修饰符实现 internal 接口方法的公共类型允许该方法由程序集外部的派生类型重写。 如果定义程序集中的第二种类型调用该方法并需要仅限内部的协定,当在外部程序集中执行重写方法时,行为可能会受到影响。 这会造成安全漏洞。

如何解决冲突

若要解决此规则的冲突,请通过以下其中一种方式阻止方法在程序集外部重写。

使声明类型为 sealed(在 Visual Basic 中为 NotInheritable)。

将声明类型的可访问性更改为 internal(在 Visual Basic 中为 Friend)。

删除声明类型中的所有公共构造函数。

在不使用 virtual 修饰符的情况下实现方法。

显式实现方法。

何时禁止显示警告

如果仔细检查后,不存在在程序集外部重写此方法时可能会被利用的安全问题,则可禁止显示此规则的警告。

示例 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

另请参阅

接口 (C#)

接口 (Visual Basic)

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档