CA2119:密封满足私有接口的方法
属性 | 值 |
---|---|
规则 ID | CA2119 |
标题 | 密封满足私有接口的方法 |
类别 | 安全性 |
修复是中断修复还是非中断修复 | 重大 |
在 .NET 8 中默认启用 | 否 |
原因
可继承的公共类型为 internal
(在 Visual Basic 中为 Friend
)接口提供可重写的方法实现。
规则说明
接口方法具有公共可访问性,实现类型不能对其进行更改。 internal 接口创建一个协定,该协定不应在定义接口的程序集的外部实现。 使用 virtual
(在 Visual Basic 中为 Overridable
)修饰符实现 internal 接口方法的公共类型允许该方法由程序集外部的派生类型重写。 如果定义程序集中的第二种类型调用该方法并需要仅限内部的协定,当在外部程序集中执行重写方法时,行为可能会受到影响。 这会造成安全漏洞。
如何解决冲突
若要解决此规则的冲突,请通过以下其中一种方式阻止方法在程序集外部重写。
使声明类型为
sealed
(在 Visual Basic 中为NotInheritable
)。将声明类型的可访问性更改为
internal
(在 Visual Basic 中为Friend
)。删除声明类型中的所有公共构造函数。
在不使用
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